diff --git a/data/sql/updates/pending_db_world/rev_1659849272980985000.sql b/data/sql/updates/pending_db_world/rev_1659849272980985000.sql
new file mode 100644
index 000000000..222de4294
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1659849272980985000.sql
@@ -0,0 +1,30 @@
+--
+DELETE FROM `spell_target_position` WHERE `ID` IN (720, 731, 1121, 518, 25831, 25832);
+INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`) VALUES
+(720, 0, 531, -8043.6, 1254.1, -84.3, 0),
+(731, 0, 531, -8003, 1222.9, -82.1, 0),
+(1121, 0, 531, -8022.3, 1149, -89.1, 0),
+(518, 0, 531, -8028.5, 1050.9, -54, 0),
+(25831, 0, 531, -8158.03, 1139.3, -83.95, 0),
+(25832, 0, 531, -8029.25, 1237.78, -85.2285, 0);
+
+DELETE FROM `smart_scripts` WHERE (`entryorguid` = 15630) AND (`source_type` = 0) AND (`id` IN (0));
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(15630, 0, 0, 0, 0, 0, 100, 3, 10000, 20000, 0, 0, 0, 11, 26662, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Spawn of Fankriss - In Combat - Cast \'Berserk\' (No Repeat) (Normal Dungeon)');
+
+DELETE FROM `creature_formations` WHERE `memberGUID` IN (87911, 87773, 87775, 87796, 87806, 87792);
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(87911, 87911, 0, 0, 3, 0, 0),
+(87911, 87773, 0, 0, 3, 0, 0),
+(87911, 87775, 0, 0, 3, 0, 0),
+(87911, 87796, 0, 0, 3, 0, 0),
+(87911, 87806, 0, 0, 3, 0, 0),
+(87911, 87792, 0, 0, 3, 0, 0);
+
+DELETE FROM `linked_respawn` WHERE `guid` IN (87773, 87775, 87796, 87806, 87792);
+INSERT INTO `linked_respawn` (`guid`, `linkedGuid`, `linkType`) VALUES
+(87773, 87911, 0),
+(87775, 87911, 0),
+(87796, 87911, 0),
+(87806, 87911, 0),
+(87792, 87911, 0);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
index c35ddb6ea..d0ca30daa 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
@@ -15,128 +15,99 @@
* with this program. If not, see .
*/
-/* ScriptData
-SDName: Boss_Fankriss
-SD%Complete: 100
-SDComment: sound not implemented
-SDCategory: Temple of Ahn'Qiraj
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "TaskScheduler.h"
#include "temple_of_ahnqiraj.h"
-#define SOUND_SENTENCE_YOU 8588
-#define SOUND_SERVE_TO 8589
-#define SOUND_LAWS 8590
-#define SOUND_TRESPASS 8591
-#define SOUND_WILL_BE 8592
-
enum Spells
{
SPELL_MORTAL_WOUND = 25646,
- SPELL_ROOT = 28858,
+ SPELL_ENTANGLE_RIGHT = 720,
+ SPELL_ENTANGLE_CENTER = 731,
+ SPELL_ENTANGLE_LEFT = 1121,
- // Enrage for his spawns
- SPELL_ENRAGE = 28798
+ SPELL_SUMMON_WORM_1 = 518,
+ SPELL_SUMMON_WORM_2 = 25831,
+ SPELL_SUMMON_WORM_3 = 25832
};
-struct boss_fankriss : public ScriptedAI
+enum Misc
{
- boss_fankriss(Creature* creature) : ScriptedAI(creature) { }
+ MAX_HATCHLING_SPAWN = 4,
+ NPC_VEKNISS_HATCHLING = 15962
+};
- void SummonSpawn()
+const std::array hatchlingsSpawnPoints
+{
{
- Rand = 10 + (rand() % 10);
- switch (rand() % 2)
- {
- case 0:
- RandX = 0.0f - Rand;
- break;
- case 1:
- RandX = 0.0f + Rand;
- break;
- }
-
- Rand = 10 + (rand() % 10);
- switch (rand() % 2)
- {
- case 0:
- RandY = 0.0f - Rand;
- break;
- case 1:
- RandY = 0.0f + Rand;
- break;
- }
- Rand = 0;
- DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+ { -8043.6f, 1254.1f, -84.3f }, // Right
+ { -8003.0f, 1222.9f, -82.1f }, // Center
+ { -8022.3f, 1149.0f, -89.1f } // Left
}
+};
- void EnterCombat(Unit* /*who*/) override
+const std::array entangleSpells = { SPELL_ENTANGLE_RIGHT, SPELL_ENTANGLE_CENTER, SPELL_ENTANGLE_LEFT };
+
+struct boss_fankriss : public BossAI
+{
+ boss_fankriss(Creature* creature) : BossAI(creature, DATA_FANKRISS) { }
+
+ void Reset() override
{
_scheduler.CancelAll();
+ summonWormSpells = { SPELL_SUMMON_WORM_1, SPELL_SUMMON_WORM_2, SPELL_SUMMON_WORM_3};
+
+ BossAI::Reset();
+ }
+
+ void SummonWorms()
+ {
+ uint32 amount = urand(1, 3);
+ Acore::Containers::RandomResize(summonWormSpells, amount);
+ for (uint32 summonSpell : summonWormSpells)
+ DoCastAOE(summonSpell, true);
+ summonWormSpells = { SPELL_SUMMON_WORM_1, SPELL_SUMMON_WORM_2, SPELL_SUMMON_WORM_3 };
+ }
+
+ void SummonHatchlingWaves()
+ {
+ for (Position spawnPos : hatchlingsSpawnPoints)
+ {
+ for (uint8 i = 0; i < MAX_HATCHLING_SPAWN; i++)
+ {
+ Position randSpawn = me->GetRandomPoint(spawnPos, 10.f);
+ me->SummonCreature(NPC_VEKNISS_HATCHLING, randSpawn, TEMPSUMMON_CORPSE_DESPAWN);
+ }
+ }
+ }
+
+ void EnterCombat(Unit* who) override
+ {
+ _scheduler.CancelAll();
+ BossAI::EnterCombat(who);
_scheduler
- .Schedule(4s, 8s, [this](TaskContext context)
+ .Schedule(7s, 14s, [this](TaskContext context)
{
DoCastVictim(SPELL_MORTAL_WOUND);
context.Repeat();
})
- .Schedule(15s, 45s, [this](TaskContext context)
+ .Schedule(30s, 50s, [this](TaskContext context)
{
- switch (urand(0, 2))
- {
- case 0:
- SummonSpawn();
- break;
- case 1:
- SummonSpawn();
- SummonSpawn();
- break;
- case 2:
- SummonSpawn();
- SummonSpawn();
- SummonSpawn();
- break;
- }
- context.Repeat(30s, 60s);
+ SummonWorms();
+ context.Repeat(22s, 70s);
})
- .Schedule(15s, 45s, [this](TaskContext context)
+ .Schedule(15s, 20s, [this](TaskContext context)
{
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
{
- DoCast(target, SPELL_ROOT);
-
- if (DoGetThreat(target))
- DoModifyThreatPercent(target, -100);
-
- switch (urand(0, 2))
- {
- case 0:
- DoTeleportPlayer(target, -8106.0142f, 1289.2900f, -74.419533f, 5.112f);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- break;
- case 1:
- DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- break;
- case 2:
- DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- break;
- }
+ uint32 spellId = Acore::Containers::SelectRandomContainerElement(entangleSpells);
+ DoCast(target, spellId);
}
- context.Repeat(45s, 60s);
+
+ SummonHatchlingWaves();
+ context.Repeat(25s, 55s);
});
}
@@ -152,9 +123,7 @@ struct boss_fankriss : public ScriptedAI
private:
TaskScheduler _scheduler;
- int Rand;
- float RandX;
- float RandY;
+ std::vector summonWormSpells;
};
void AddSC_boss_fankriss()
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
index 70215f2b1..bd8f239eb 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
@@ -35,6 +35,7 @@ enum DataTypes
DATA_VEKNILASH = 9,
DATA_VEKNILASHISDEAD = 10,
DATA_VEKNILASH_DEATH = 11,
+ DATA_FANKRISS = 12,
DATA_BUG_TRIO_DEATH = 14,
DATA_CTHUN_PHASE = 20,
DATA_VISCIDUS = 21,