diff --git a/data/sql/updates/pending_db_world/rev_1668941470853125700.sql b/data/sql/updates/pending_db_world/rev_1668941470853125700.sql
new file mode 100644
index 000000000..572caaebf
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1668941470853125700.sql
@@ -0,0 +1,62 @@
+--
+UPDATE `creature` SET `position_x`=193.68, `position_y`=-425.001, `position_z`=43.536, `orientation`=4.910, `MovementType`=2 WHERE `id1`=18105;
+
+SET @CGUID := (SELECT `guid` FROM `creature` WHERE `id1`=18105);
+DELETE FROM `creature_addon` WHERE `guid`=@CGUID;
+INSERT INTO `creature_addon` VALUES
+(@CGUID,@CGUID*10,0,0,1,0,0,'');
+
+DELETE FROM `waypoint_data` WHERE `id` IN (@CGUID*10,(@CGUID*10)+1);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@CGUID*10,1,220.287480,-447.83450,43.72291,0,0,0,0,100,0),
+(@CGUID*10,2,217.265560,-424.75412,45.52847,0,0,0,0,100,0),
+(@CGUID*10,3,225.281620,-398.65262,45.47290,0,0,0,0,100,0),
+(@CGUID*10,4,253.491170,-397.89430,45.52849,0,0,0,0,100,0),
+(@CGUID*10,5,253.131480,-414.29672,44.77849,0,0,0,0,100,0),
+(@CGUID*10,6,234.916290,-424.61800,44.61180,0,0,0,0,100,0),
+(@CGUID*10,7,223.580960,-426.78760,44.61183,0,0,0,0,100,0),
+(@CGUID*10,8,204.304470,-431.26736,44.13958,0,0,0,0,100,0),
+(@CGUID*10,9,196.254750,-456.66520,42.61182,0,0,0,0,100,0),
+(@CGUID*10,10,223.04488,-479.07944,32.47294,0,0,0,0,100,0),
+(@CGUID*10,11,263.47906,-480.66202,46.80626,0,0,0,0,100,0),
+(@CGUID*10,12,278.39508,-477.34967,43.88961,0,0,0,0,100,0),
+(@CGUID*10,13,276.92447,-457.94210,37.05632,0,0,0,0,100,0),
+(@CGUID*10,14,276.92447,-457.94210,37.05632,0,0,0,0,100,0),
+(@CGUID*10,15,275.60797,-469.67816,33.47302,0,0,0,0,100,0),
+(@CGUID*10,16,276.92447,-457.94210,37.05631,0,0,0,0,100,0),
+(@CGUID*10,17,278.24097,-446.20605,40.63961,0,0,0,0,100,0),
+(@CGUID*10,18,260.68362,-421.50210,43.44514,0,0,0,0,100,0),
+(@CGUID*10,19,233.34468,-409.80292,45.11180,0,0,0,0,100,0),
+(@CGUID*10,20,193.74000,-423.40268,43.58399,0,0,0,0,100,0),
+
+((@CGUID*10)+1,1,276.92447,-457.9421,37.05632,0,0,0,0,100,0),
+((@CGUID*10)+1,2,230.84842,-473.81586,44.384487,0,0,0,0,100,0),
+((@CGUID*10)+1,3,223.15588,-474.34158,46.36878,0,0,0,0,100,0),
+((@CGUID*10)+1,4,214.68163,-479.58606,52.51196,0,0,0,0,100,0),
+((@CGUID*10)+1,5,200.88074,-483.32407,58.438652,0,0,0,0,100,0),
+((@CGUID*10)+1,6,185.70932,-485.64243,64.15632,0,0,0,0,100,0),
+((@CGUID*10)+1,7,175.2845,-486.21573,67.86781,0,0,0,0,100,0),
+((@CGUID*10)+1,8,160.93648,-476.7256,74.70425,0,0,0,0,100,0),
+((@CGUID*10)+1,9,158.37117,-472.06967,74.63962,0,0,0,0,100,0),
+((@CGUID*10)+1,10,159.37047,-467.53186,75.40111,0,0,0,0,100,0),
+((@CGUID*10)+1,11,180.78477,-471.30957,77.03179,0,0,0,0,100,0),
+((@CGUID*10)+1,12,189.26646,-471.74365,77.766594,0,0,0,0,100,0),
+((@CGUID*10)+1,13,200.31303,-472.0223,79.02495,0,0,0,0,100,0),
+((@CGUID*10)+1,14,212.294,-480.27985,80.729095,0,0,0,0,100,0),
+((@CGUID*10)+1,15,222.19577,-476.2322,81.27319,0,0,0,0,100,0),
+((@CGUID*10)+1,16,233.52731,-471.28235,81.37284,0,0,0,0,100,0),
+((@CGUID*10)+1,17,239.5655,-468.65033,81.37284,0,0,0,0,100,0),
+((@CGUID*10)+1,18,248.33444,-465.86627,81.37284,0,0,0,0,100,0),
+((@CGUID*10)+1,19,260.44455,-457.9094,81.37284,0,0,0,0,100,0),
+((@CGUID*10)+1,20,256.2785,-458.73138,81.37284,3.543018341064453125,0,0,0,100,0);
+
+DELETE FROM `areatrigger_scripts` WHERE `entry`=4302;
+INSERT INTO `areatrigger_scripts` VALUES
+(4302,'at_underbog_ghazan');
+
+DELETE FROM `spelldifficulty_dbc` WHERE `ID`=34267;
+INSERT INTO `spelldifficulty_dbc` VALUES
+(34267,34267,38737,0,0);
+
+UPDATE `creature_template` SET `AiName`='', `ScriptName`='boss_ghazan' WHERE `entry`=18105;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=18105;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp
new file mode 100644
index 000000000..a70bc4e04
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp
@@ -0,0 +1,182 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 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 Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "the_underbog.h"
+
+enum eBlackStalker
+{
+ SPELL_ACID_BREATH = 34268,
+ SPELL_ACID_SPIT = 34290,
+ SPELL_TAIL_SWEEP = 34267,
+ SPELL_ENRAGE = 15716,
+
+ EVENT_ACID_BREATH = 1,
+ EVENT_ACID_SPIT = 2,
+ EVENT_TAIL_SWEEP = 3,
+
+ ACTION_MOVE_TO_PLATFORM = 1
+};
+
+struct boss_ghazan : public ScriptedAI
+{
+ boss_ghazan(Creature* creature) : ScriptedAI(creature)
+ {
+ }
+
+ void InitializeAI() override
+ {
+ _movedToPlatform = false;
+ _reachedPlatform = false;
+ Reset();
+ }
+
+ void Reset() override
+ {
+ events.Reset();
+ _enraged = false;
+ if (!_reachedPlatform)
+ {
+ _movedToPlatform = false;
+ }
+ }
+
+ void EnterCombat(Unit*) override
+ {
+ events.ScheduleEvent(EVENT_ACID_BREATH, 3s);
+ events.ScheduleEvent(EVENT_ACID_SPIT, 1s);
+ events.ScheduleEvent(EVENT_TAIL_SWEEP, DUNGEON_MODE(5900ms, 10s));
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override
+ {
+ if (!_enraged && me->HealthBelowPctDamaged(20, damage))
+ {
+ _enraged = true;
+ DoCastSelf(SPELL_ENRAGE);
+ }
+ }
+
+ void DoAction(int32 type) override
+ {
+ if (type == ACTION_MOVE_TO_PLATFORM && !_movedToPlatform)
+ {
+ _movedToPlatform = true;
+ me->GetMotionMaster()->MovePath((me->GetSpawnId() * 10) + 1, false);
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (!_movedToPlatform || type != WAYPOINT_MOTION_TYPE || pointId != 19)
+ {
+ return;
+ }
+
+ _reachedPlatform = true;
+ me->SetHomePosition(me->GetPosition());
+
+ me->m_Events.AddEventAtOffset([this]()
+ {
+ me->StopMoving();
+ me->GetMotionMaster()->MoveRandom(12.f);
+ }, 1ms);
+ }
+
+ void JustReachedHome() override
+ {
+ if (_reachedPlatform)
+ {
+ me->GetMotionMaster()->MoveRandom(12.f);
+ }
+ }
+
+ 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_BREATH:
+ DoCastVictim(SPELL_ACID_BREATH);
+ events.Repeat(7s, 9s);
+ break;
+ case EVENT_ACID_SPIT:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random))
+ {
+ DoCast(target, SPELL_ACID_SPIT);
+ }
+ events.Repeat(7s, 9s);
+ break;
+ case EVENT_TAIL_SWEEP:
+ DoCastVictim(SPELL_TAIL_SWEEP);
+ events.Repeat(7s, 9s);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool _enraged;
+ bool _movedToPlatform;
+ bool _reachedPlatform;
+};
+
+class at_underbog_ghazan : public OnlyOnceAreaTriggerScript
+{
+public:
+ at_underbog_ghazan() : OnlyOnceAreaTriggerScript("at_underbog_ghazan") {}
+
+ bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override
+ {
+ if (InstanceScript* instance = player->GetInstanceScript())
+ {
+ if (Creature* ghazan = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_GHAZAN)))
+ {
+ ghazan->AI()->DoAction(ACTION_MOVE_TO_PLATFORM);
+ return true;
+ }
+ }
+
+ return false;
+ }
+};
+
+void AddSC_boss_ghazan()
+{
+ RegisterUnderbogCreatureAI(boss_ghazan);
+ new at_underbog_ghazan();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/instance_the_underbog.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/instance_the_underbog.cpp
index b892e8a6b..b30f1915c 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/underbog/instance_the_underbog.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/instance_the_underbog.cpp
@@ -15,13 +15,6 @@
* with this program. If not, see .
*/
-/*
- This placeholder for the instance is needed for dungeon finding to be able
- to give credit after the boss defined in lastEncounterDungeon is killed.
- Without it, the party doing random dungeon won't get satchel of spoils and
- gets instead the deserter debuff.
-*/
-
#include "InstanceScript.h"
#include "Map.h"
#include "ScriptMgr.h"
@@ -40,6 +33,36 @@ public:
struct instance_the_underbog_InstanceMapScript : public InstanceScript
{
instance_the_underbog_InstanceMapScript(Map* map) : InstanceScript(map) { }
+
+ void OnCreatureCreate(Creature* creature) override
+ {
+ InstanceScript::OnCreatureCreate(creature);
+
+ switch (creature->GetEntry())
+ {
+ case NPC_GHAZAN:
+ _ghazanGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
+ }
+
+ ObjectGuid GetGuidData(uint32 type) const override
+ {
+ switch (type)
+ {
+ case NPC_GHAZAN:
+ return _ghazanGUID;
+ default:
+ break;
+ }
+
+ return ObjectGuid::Empty;
+ }
+
+ private:
+ ObjectGuid _ghazanGUID;
};
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/the_underbog.h b/src/server/scripts/Outland/CoilfangReservoir/underbog/the_underbog.h
index ecc1f5be5..9b0a51b1d 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/underbog/the_underbog.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/the_underbog.h
@@ -22,10 +22,17 @@
#define TheUnderbogScriptName "instance_the_underbog"
+enum NPCs
+{
+ NPC_GHAZAN = 18105
+};
+
template
inline AI* GetTheUnderbogAI(T* obj)
{
return GetInstanceAI(obj, TheUnderbogScriptName);
}
+#define RegisterUnderbogCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetTheUnderbogAI)
+
#endif // the_underbog_h__
diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp
index df02e86d3..bacda01c0 100644
--- a/src/server/scripts/Outland/outland_script_loader.cpp
+++ b/src/server/scripts/Outland/outland_script_loader.cpp
@@ -51,6 +51,7 @@ void AddSC_boss_mekgineer_steamrigger();
void AddSC_boss_warlord_kalithresh();
void AddSC_instance_steam_vault();
void AddSC_boss_the_black_stalker(); //CR Underbog
+void AddSC_boss_ghazan();
void AddSC_instance_the_underbog();
void AddSC_boss_ahune();
void AddSC_instance_the_slave_pens();
@@ -144,6 +145,7 @@ void AddOutlandScripts()
AddSC_boss_warlord_kalithresh();
AddSC_instance_steam_vault();
AddSC_boss_the_black_stalker(); //CR Underbog
+ AddSC_boss_ghazan();
AddSC_instance_the_underbog();
AddSC_boss_ahune();
AddSC_instance_the_slave_pens();