aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2021_11_10_00_world.sql21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp32
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp94
-rw-r--r--src/server/scripts/World/mob_generic_creature.cpp60
-rw-r--r--src/server/scripts/World/npcs_special.cpp32
-rw-r--r--src/server/scripts/World/world_script_loader.cpp2
6 files changed, 156 insertions, 85 deletions
diff --git a/sql/updates/world/3.3.5/2021_11_10_00_world.sql b/sql/updates/world/3.3.5/2021_11_10_00_world.sql
new file mode 100644
index 00000000000..b4e7722e214
--- /dev/null
+++ b/sql/updates/world/3.3.5/2021_11_10_00_world.sql
@@ -0,0 +1,21 @@
+-- Shadow Fissure
+UPDATE `creature_template` SET `unit_flags` = 33554432, `unit_flags2` = `unit_flags2` &~ 2048, `BaseAttackTime` = 2000, `ScriptName` = 'npc_kelthuzad_shadow_fissure' WHERE `entry` = 16129;
+DELETE FROM `creature_template_spell` WHERE `CreatureID` = 16129;
+
+-- Sapphiron's Wing Buffet
+UPDATE `creature_template` SET `BaseAttackTime` = 2000, `ScriptName` = 'npc_sapphiron_wing_buffet', `flags_extra` = `flags_extra` &~ 0x00002000 WHERE `entry` = 17025;
+DELETE FROM `creature_template_addon` WHERE `entry` = 17025;
+
+DELETE FROM `spell_script_names` WHERE `spell_id` = 29330 AND `ScriptName` = 'spell_sapphiron_wing_buffet_despawn_periodic';
+DELETE FROM `spell_script_names` WHERE `spell_id` = 29336 AND `ScriptName` = 'spell_sapphiron_despawn_buffet';
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(29330,'spell_sapphiron_wing_buffet_despawn_periodic'),
+(29336,'spell_sapphiron_despawn_buffet');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 29336;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,29336,0,0,31,0,3,17025,0,0,0,0,"","Group 0: Spell 'Despawn Buffet' (Effect 0) targets creature 'Sapphiron's Wing Buffet'");
+
+-- Void Zone
+UPDATE `creature_template` SET `unit_flags2` = `unit_flags2` &~ 2048, `BaseAttackTime` = 2000, `ScriptName` = 'npc_gen_void_zone' WHERE `entry` = 16697;
+DELETE FROM `creature_template_spell` WHERE `CreatureID` = 16697;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 575dd11a361..0c997074a7a 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
@@ -105,7 +105,10 @@ enum Spells
SPELL_MORTAL_WOUND = 28467,
// Guardian of Icecrown
- SPELL_BLOOD_TAP = 28470
+ SPELL_BLOOD_TAP = 28470,
+
+ // Shadow Fissure
+ SPELL_VOID_BLAST = 27812
};
static const uint8 nGuardianSpawns = 4;
@@ -825,6 +828,32 @@ struct npc_kelthuzad_guardian : public ScriptedAI
uint32 _bloodTapTimer;
};
+struct npc_kelthuzad_shadow_fissure : public ScriptedAI
+{
+ npc_kelthuzad_shadow_fissure(Creature* creature) : ScriptedAI(creature) { }
+
+ void InitializeAI() override
+ {
+ me->SetReactState(REACT_PASSIVE);
+ }
+
+ void JustAppeared() override
+ {
+ _scheduler.Schedule(5s, [this](TaskContext /*task*/)
+ {
+ DoCastSelf(SPELL_VOID_BLAST);
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
// 28410 - Chains of Kel'Thuzad
class spell_kelthuzad_chains : public AuraScript
{
@@ -956,6 +985,7 @@ void AddSC_boss_kelthuzad()
RegisterNaxxramasCreatureAI(npc_kelthuzad_banshee);
RegisterNaxxramasCreatureAI(npc_kelthuzad_abomination);
RegisterNaxxramasCreatureAI(npc_kelthuzad_guardian);
+ RegisterNaxxramasCreatureAI(npc_kelthuzad_shadow_fissure);
RegisterSpellScript(spell_kelthuzad_chains);
RegisterSpellScript(spell_kelthuzad_detonate_mana);
RegisterSpellScript(spell_kelthuzad_frost_blast);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index 75f3db5a595..062346066cc 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -38,19 +38,22 @@ enum Yells
enum Spells
{
- SPELL_FROST_AURA = 28531,
- SPELL_CLEAVE = 19983,
- SPELL_TAIL_SWEEP = 55697,
- SPELL_SUMMON_BLIZZARD = 28560,
- SPELL_LIFE_DRAIN = 28542,
- SPELL_ICEBOLT = 28522,
- SPELL_FROST_BREATH_ANTICHEAT = 29318, // damage effect ignoring LoS on the entrance platform to prevent cheese
- SPELL_FROST_BREATH = 28524, // damage effect below sapphiron
- SPELL_FROST_MISSILE = 30101, // visual only
- SPELL_BERSERK = 26662,
- SPELL_DIES = 29357,
- SPELL_CHECK_RESISTS = 60539,
- SPELL_SAPPHIRON_WING_BUFFET = 29328
+ SPELL_FROST_AURA = 28531,
+ SPELL_CLEAVE = 19983,
+ SPELL_TAIL_SWEEP = 55697,
+ SPELL_SUMMON_BLIZZARD = 28560,
+ SPELL_LIFE_DRAIN = 28542,
+ SPELL_ICEBOLT = 28522,
+ SPELL_FROST_BREATH_ANTICHEAT = 29318, // damage effect ignoring LoS on the entrance platform to prevent cheese
+ SPELL_FROST_BREATH = 28524, // damage effect below sapphiron
+ SPELL_FROST_MISSILE = 30101, // visual only
+ SPELL_BERSERK = 26662,
+ SPELL_DIES = 29357,
+ SPELL_CHECK_RESISTS = 60539,
+ SPELL_SUMMON_WING_BUFFET = 29329,
+ SPELL_WING_BUFFET_PERIODIC = 29327,
+ SPELL_WING_BUFFET_DESPAWN_PERIODIC = 29330,
+ SPELL_DESPAWN_BUFFET = 29336
};
enum Phases
@@ -81,7 +84,6 @@ enum Events
enum Misc
{
NPC_BLIZZARD = 16474,
- NPC_WING_BUFFET = 17025,
GO_ICEBLOCK = 181247,
// The Hundred Club
@@ -335,8 +337,7 @@ struct boss_sapphiron : public BossAI
case EVENT_LIFTOFF:
{
Talk(EMOTE_AIR_PHASE);
- if (Creature* buffet = DoSummon(NPC_WING_BUFFET, me, 0.0f, 0s, TEMPSUMMON_MANUAL_DESPAWN))
- _buffet = buffet->GetGUID();
+ DoCastSelf(SPELL_SUMMON_WING_BUFFET);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetHover(true);
events.ScheduleEvent(EVENT_ICEBOLT, Seconds(7), 0, PHASE_FLIGHT);
@@ -382,13 +383,9 @@ struct boss_sapphiron : public BossAI
events.ScheduleEvent(EVENT_LAND, Seconds(3) + Milliseconds(500), 0, PHASE_FLIGHT);
return;
case EVENT_LAND:
+ DoCastSelf(SPELL_DESPAWN_BUFFET); /// @todo: at this point it should already despawn, probably that spell is used in another place
if (_delayedDrain)
CastDrain();
- if (Creature* cBuffet = ObjectAccessor::GetCreature(*me, _buffet))
- {
- cBuffet->DespawnOrUnsummon(1s);
- _buffet.Clear();
- }
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
Talk(EMOTE_GROUND_PHASE);
me->SetHover(false);
@@ -410,7 +407,6 @@ struct boss_sapphiron : public BossAI
private:
GuidVector _iceboltTargets;
- ObjectGuid _buffet;
bool _delayedDrain;
bool _canTheHundredClub;
};
@@ -450,6 +446,22 @@ private:
ObjectGuid _targetGuid;
};
+struct npc_sapphiron_wing_buffet : public ScriptedAI
+{
+ npc_sapphiron_wing_buffet(Creature* creature) : ScriptedAI(creature) { }
+
+ void InitializeAI() override
+ {
+ me->SetReactState(REACT_PASSIVE);
+ }
+
+ void JustAppeared() override
+ {
+ DoCastSelf(SPELL_WING_BUFFET_PERIODIC);
+ DoCastSelf(SPELL_WING_BUFFET_DESPAWN_PERIODIC);
+ }
+};
+
struct go_sapphiron_birth : public GameObjectAI
{
go_sapphiron_birth(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
@@ -581,6 +593,41 @@ class spell_sapphiron_summon_blizzard : public SpellScript
}
};
+// 29330 - Sapphiron's Wing Buffet Despawn
+class spell_sapphiron_wing_buffet_despawn_periodic : public AuraScript
+{
+ PrepareAuraScript(spell_sapphiron_wing_buffet_despawn_periodic);
+
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ if (Creature* creature = target->ToCreature())
+ creature->DespawnOrUnsummon();
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_sapphiron_wing_buffet_despawn_periodic::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+};
+
+// 29336 - Despawn Buffet
+class spell_sapphiron_despawn_buffet : public SpellScript
+{
+ PrepareSpellScript(spell_sapphiron_despawn_buffet);
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Creature* target = GetHitCreature())
+ target->DespawnOrUnsummon();
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sapphiron_despawn_buffet::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
class achievement_the_hundred_club : public AchievementCriteriaScript
{
public:
@@ -596,9 +643,12 @@ void AddSC_boss_sapphiron()
{
RegisterNaxxramasCreatureAI(boss_sapphiron);
RegisterNaxxramasCreatureAI(npc_sapphiron_blizzard);
+ RegisterNaxxramasCreatureAI(npc_sapphiron_wing_buffet);
RegisterNaxxramasGameObjectAI(go_sapphiron_birth);
RegisterSpellScript(spell_sapphiron_change_blizzard_target);
RegisterSpellScript(spell_sapphiron_icebolt);
RegisterSpellScript(spell_sapphiron_summon_blizzard);
+ RegisterSpellScript(spell_sapphiron_wing_buffet_despawn_periodic);
+ RegisterSpellScript(spell_sapphiron_despawn_buffet);
new achievement_the_hundred_club();
}
diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp
deleted file mode 100644
index abc31bbb514..00000000000
--- a/src/server/scripts/World/mob_generic_creature.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * This file is part of the TrinityCore 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 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 "Creature.h"
-#include "PassiveAI.h"
-#include "SpellMgr.h"
-
-class trigger_periodic : public CreatureScript
-{
-public:
- trigger_periodic() : CreatureScript("trigger_periodic") { }
-
- struct trigger_periodicAI : public NullCreatureAI
- {
- trigger_periodicAI(Creature* creature) : NullCreatureAI(creature)
- {
- interval = me->GetAttackTime(BASE_ATTACK);
- timer = interval;
- }
-
- uint32 timer, interval;
-
- void UpdateAI(uint32 diff) override
- {
- if (timer <= diff)
- {
- if (uint32 spell = me->m_spells[0])
- me->CastSpell(me, spell, TRIGGERED_FULL_MASK);
- timer = interval;
- }
- else
- timer -= diff;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new trigger_periodicAI(creature);
- }
-};
-
-void AddSC_generic_creature()
-{
- new trigger_periodic();
-}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index ff622f58201..e457016e482 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -2694,6 +2694,37 @@ public:
}
};
+enum VoidZone
+{
+ SPELL_CONSUMPTION = 28874
+};
+
+struct npc_gen_void_zone : public ScriptedAI
+{
+ npc_gen_void_zone(Creature* creature) : ScriptedAI(creature) { }
+
+ void InitializeAI() override
+ {
+ me->SetReactState(REACT_PASSIVE);
+ }
+
+ void JustAppeared() override
+ {
+ _scheduler.Schedule(2s, [this](TaskContext /*task*/)
+ {
+ DoCastSelf(SPELL_CONSUMPTION);
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
void AddSC_npcs_special()
{
new npc_air_force_bots();
@@ -2720,4 +2751,5 @@ void AddSC_npcs_special()
new npc_train_wrecker();
new npc_argent_squire_gruntling();
new npc_bountiful_table();
+ RegisterCreatureAI(npc_gen_void_zone);
}
diff --git a/src/server/scripts/World/world_script_loader.cpp b/src/server/scripts/World/world_script_loader.cpp
index bdfd0db25ec..d4e53a85ea0 100644
--- a/src/server/scripts/World/world_script_loader.cpp
+++ b/src/server/scripts/World/world_script_loader.cpp
@@ -21,7 +21,6 @@
// world
void AddSC_areatrigger_scripts();
void AddSC_emerald_dragons();
-void AddSC_generic_creature();
void AddSC_go_scripts();
void AddSC_npc_guard();
void AddSC_item_scripts();
@@ -42,7 +41,6 @@ void AddWorldScripts()
{
AddSC_areatrigger_scripts();
AddSC_emerald_dragons();
- AddSC_generic_creature();
AddSC_go_scripts();
AddSC_npc_guard();
AddSC_item_scripts();