aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_04_23_00_world.sql9
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h4
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp2
-rw-r--r--src/server/game/Entities/Pet/PetDefines.h1
-rw-r--r--src/server/game/Spells/Spell.cpp2
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp161
6 files changed, 176 insertions, 3 deletions
diff --git a/sql/updates/world/master/2023_04_23_00_world.sql b/sql/updates/world/master/2023_04_23_00_world.sql
new file mode 100644
index 00000000000..8917b3b097d
--- /dev/null
+++ b/sql/updates/world/master/2023_04_23_00_world.sql
@@ -0,0 +1,9 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warl_strengthen_pact_succubus','spell_warl_strengthen_pact_incubus','spell_warl_random_sayaad','spell_warl_summon_sayaad','spell_warl_sayaad_precast_disorientation');
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(366323,'spell_warl_strengthen_pact_succubus'),
+(366325,'spell_warl_strengthen_pact_incubus'),
+(366330,'spell_warl_random_sayaad'),
+(366222,'spell_warl_summon_sayaad'),
+(366323,'spell_warl_sayaad_precast_disorientation'),
+(366325,'spell_warl_sayaad_precast_disorientation'),
+(366222,'spell_warl_sayaad_precast_disorientation');
diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index 27dfea28506..4b0778ff796 100644
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -29,6 +29,7 @@ enum PetEntry
PET_SUCCUBUS = 1863,
PET_DOOMGUARD = 18540,
PET_FELGUARD = 30146,
+ PET_INCUBUS = 184600,
// Death Knight pets
PET_GHOUL = 26125,
@@ -94,9 +95,10 @@ class TC_GAME_API Minion : public TempSummon
bool IsPetImp() const { return GetEntry() == PET_IMP; }
bool IsPetFelhunter() const { return GetEntry() == PET_FEL_HUNTER; }
bool IsPetVoidwalker() const { return GetEntry() == PET_VOID_WALKER; }
- bool IsPetSuccubus() const { return GetEntry() == PET_SUCCUBUS; }
+ bool IsPetSayaad() const { return GetEntry() == PET_SUCCUBUS || GetEntry() == PET_INCUBUS; }
bool IsPetDoomguard() const { return GetEntry() == PET_DOOMGUARD; }
bool IsPetFelguard() const { return GetEntry() == PET_FELGUARD; }
+ bool IsWarlockPet() const { return IsPetImp() || IsPetFelhunter() || IsPetVoidwalker() || IsPetSayaad() || IsPetDoomguard() || IsPetFelguard(); }
// Death Knight pets
bool IsPetGhoul() const { return GetEntry() == PET_GHOUL; } // Ghoul may be guardian or pet
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 10283386cc6..e95740ea408 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -931,7 +931,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel)
SetPowerType(POWER_ENERGY);
SetFullPower(POWER_ENERGY);
}
- else if (IsPetImp() || IsPetFelhunter() || IsPetVoidwalker() || IsPetSuccubus() || IsPetDoomguard() || IsPetFelguard()) // Warlock pets have energy (since 5.x)
+ else if (IsWarlockPet()) // Warlock pets have energy (since 5.x)
SetPowerType(POWER_ENERGY);
else
SetPowerType(POWER_MANA);
diff --git a/src/server/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h
index 0b1048e79d0..607efbf59df 100644
--- a/src/server/game/Entities/Pet/PetDefines.h
+++ b/src/server/game/Entities/Pet/PetDefines.h
@@ -111,6 +111,7 @@ enum class PetTameResult : uint8
};
constexpr uint32 CALL_PET_SPELL_ID = 883;
+constexpr uint32 PET_SUMMONING_DISORIENTATION = 32752;
class PetStable
{
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index f13171af2df..77d5cf5e449 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6174,7 +6174,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
{
if (strict) //starting cast, trigger pet stun (cast by pet so it doesn't attack player)
if (Pet* pet = unitCaster->ToPlayer()->GetPet())
- pet->CastSpell(pet, 32752, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ pet->CastSpell(pet, PET_SUMMONING_DISORIENTATION, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCaster(pet->GetGUID())
.SetTriggeringSpell(this));
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index b5ab487628a..7d2c4c00aab 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -26,6 +26,7 @@
#include "Creature.h"
#include "GameObject.h"
#include "ObjectAccessor.h"
+#include "Pet.h"
#include "Player.h"
#include "Random.h"
#include "SpellAuraEffects.h"
@@ -63,6 +64,12 @@ enum WarlockSpells
SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117,
SPELL_WARLOCK_SHADOWFLAME = 37378,
SPELL_WARLOCK_FLAMESHADOW = 37379,
+ SPELL_WARLOCK_SUMMON_SUCCUBUS = 712,
+ SPELL_WARLOCK_SUMMON_INCUBUS = 365349,
+ SPELL_WARLOCK_STRENGTHEN_PACT_SUCCUBUS = 366323,
+ SPELL_WARLOCK_STRENGTHEN_PACT_INCUBUS = 366325,
+ SPELL_WARLOCK_SUCCUBUS_PACT = 365360,
+ SPELL_WARLOCK_INCUBUS_PACT = 365355
};
enum MiscSpells
@@ -408,6 +415,74 @@ class spell_warl_immolate : public SpellScript
}
};
+// 366330 - Random Sayaad
+class spell_warl_random_sayaad : public SpellScript
+{
+ PrepareSpellScript(spell_warl_random_sayaad);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_WARLOCK_SUCCUBUS_PACT,
+ SPELL_WARLOCK_INCUBUS_PACT
+ });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+
+ caster->RemoveAurasDueToSpell(SPELL_WARLOCK_SUCCUBUS_PACT);
+ caster->RemoveAurasDueToSpell(SPELL_WARLOCK_INCUBUS_PACT);
+
+ Player* player = GetCaster()->ToPlayer();
+ if (!player)
+ return;
+
+ if (Pet* pet = player->GetPet())
+ {
+ if (pet->IsPetSayaad())
+ pet->DespawnOrUnsummon();
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_warl_random_sayaad::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 366323 - Strengthen Pact - Succubus
+// 366325 - Strengthen Pact - Incubus
+// 366222 - Summon Sayaad
+class spell_warl_sayaad_precast_disorientation : public SpellScript
+{
+ PrepareSpellScript(spell_warl_sayaad_precast_disorientation);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ PET_SUMMONING_DISORIENTATION });
+ }
+
+ // Note: this is a special case in which the warlock's minion pet must also cast Summon Disorientation at the beginning since this is only handled by SPELL_EFFECT_SUMMON_PET in Spell::CheckCast.
+ void OnPrecast() override
+ {
+ Player* player = GetCaster()->ToPlayer();
+ if (!player)
+ return;
+
+ if (Pet* pet = player->GetPet())
+ pet->CastSpell(pet, PET_SUMMONING_DISORIENTATION, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCaster(pet->GetGUID())
+ .SetTriggeringSpell(GetSpell()));
+ }
+
+ void Register() override
+ {
+ }
+};
+
// 6358 - Seduction (Special Ability)
class spell_warl_seduction : public SpellScript
{
@@ -745,6 +820,87 @@ class spell_warl_soulshatter : public SpellScript
}
};
+// 366323 - Strengthen Pact - Succubus
+class spell_warl_strengthen_pact_succubus : public SpellScript
+{
+ PrepareSpellScript(spell_warl_strengthen_pact_succubus);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_WARLOCK_SUCCUBUS_PACT,
+ SPELL_WARLOCK_SUMMON_SUCCUBUS
+ });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+
+ caster->CastSpell(nullptr, SPELL_WARLOCK_SUCCUBUS_PACT, TRIGGERED_FULL_MASK);
+ caster->CastSpell(nullptr, SPELL_WARLOCK_SUMMON_SUCCUBUS, TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_warl_strengthen_pact_succubus::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 366325 - Strengthen Pact - Incubus
+class spell_warl_strengthen_pact_incubus : public SpellScript
+{
+ PrepareSpellScript(spell_warl_strengthen_pact_incubus);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_WARLOCK_INCUBUS_PACT,
+ SPELL_WARLOCK_SUMMON_INCUBUS
+ });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+
+ caster->CastSpell(nullptr, SPELL_WARLOCK_INCUBUS_PACT, TRIGGERED_FULL_MASK);
+ caster->CastSpell(nullptr, SPELL_WARLOCK_SUMMON_INCUBUS, TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_warl_strengthen_pact_incubus::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 366222 - Summon Sayaad
+class spell_warl_summon_sayaad : public SpellScript
+{
+ PrepareSpellScript(spell_warl_summon_sayaad);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_WARLOCK_SUMMON_SUCCUBUS,
+ SPELL_WARLOCK_SUMMON_INCUBUS
+ });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(nullptr, roll_chance_i(50) ? SPELL_WARLOCK_SUMMON_SUCCUBUS : SPELL_WARLOCK_SUMMON_INCUBUS, TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_warl_summon_sayaad::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
// 37377 - Shadowflame
// 39437 - Shadowflame Hellfire and RoF
template <uint32 Trigger>
@@ -850,6 +1006,8 @@ void AddSC_warlock_spell_scripts()
RegisterSpellScript(spell_warl_health_funnel);
RegisterSpellScript(spell_warl_healthstone_heal);
RegisterSpellScript(spell_warl_immolate);
+ RegisterSpellScript(spell_warl_random_sayaad);
+ RegisterSpellScript(spell_warl_sayaad_precast_disorientation);
RegisterSpellScript(spell_warl_seduction);
RegisterSpellScript(spell_warl_seed_of_corruption);
RegisterSpellScript(spell_warl_seed_of_corruption_dummy);
@@ -860,6 +1018,9 @@ void AddSC_warlock_spell_scripts()
RegisterSpellScript(spell_warl_soul_swap_exhale);
RegisterSpellScript(spell_warl_soul_swap_override);
RegisterSpellScript(spell_warl_soulshatter);
+ RegisterSpellScript(spell_warl_strengthen_pact_succubus);
+ RegisterSpellScript(spell_warl_strengthen_pact_incubus);
+ RegisterSpellScript(spell_warl_summon_sayaad);
RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_FLAMESHADOW>, "spell_warl_t4_2p_bonus_shadow");
RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_SHADOWFLAME>, "spell_warl_t4_2p_bonus_fire");
RegisterSpellScript(spell_warl_unstable_affliction);