aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2021_11_15_34_world_2018_12_03_00_word.sql23
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp9
-rw-r--r--src/server/scripts/Outland/zone_nagrand.cpp289
4 files changed, 312 insertions, 12 deletions
diff --git a/sql/updates/world/master/2021_11_15_34_world_2018_12_03_00_word.sql b/sql/updates/world/master/2021_11_15_34_world_2018_12_03_00_word.sql
new file mode 100644
index 00000000000..3793dd6781a
--- /dev/null
+++ b/sql/updates/world/master/2021_11_15_34_world_2018_12_03_00_word.sql
@@ -0,0 +1,23 @@
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (17146,17147,17148,18064,18391);
+UPDATE `creature_template` SET `AIname` = '', `ScriptName` = 'npc_nagrand_banner' WHERE `entry` IN (17138,17146,17147,17148,18064,18391,18413);
+
+UPDATE `event_scripts` SET `delay`=0 WHERE `id`=11669;
+UPDATE `event_scripts` SET `datalong2`=1 WHERE `id`=11674;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (32307, 32314);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 3, 32307, 0, 0, 31, 0, 3, 17146, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit Kil\'sorrow Spellbinder.'),
+(13, 3, 32307, 0, 0, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit if target is dead'),
+(13, 3, 32307, 0, 1, 31, 0, 3, 17147, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit Kil\'sorrow Cultist.'),
+(13, 3, 32307, 0, 1, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit if target is dead'),
+(13, 3, 32307, 0, 2, 31, 0, 3, 17148, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit Kil\'sorrow Deathsworn.'),
+(13, 3, 32307, 0, 2, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit if target is dead'),
+(13, 3, 32307, 0, 3, 31, 0, 3, 18391, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit Giselda the Crone.'),
+(13, 3, 32307, 0, 3, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Warmaul Ogre Banner" (effects 0 & 1) will hit if target is dead'),
+
+(13, 3, 32314, 0, 0, 31, 0, 3, 17138, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit Warmaul Reaver.'),
+(13, 3, 32314, 0, 0, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit if target is dead.'),
+(13, 3, 32314, 0, 1, 31, 0, 3, 18064, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit Warmaul Shaman.'),
+(13, 3, 32314, 0, 1, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit if target is dead.'),
+(13, 3, 32314, 0, 2, 31, 0, 3, 18413, 0, 0, 0, 0, 'conditition_nagrand_banner', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit Zorbo the Advisor.'),
+(13, 3, 32314, 0, 2, 36, 0, 0, 0, 0, 1, 0, 0, '', 'Spell "Plant Kil\'Sorrow Banner" (effects 0 & 1) will hit if target is dead.');
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 93ee5c2625c..95eedba3161 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -558,8 +558,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const
if (!condMeets)
sourceInfo.mLastFailedCondition = this;
- bool script = sScriptMgr->OnConditionCheck(this, sourceInfo); // Returns true by default.
- return condMeets && script;
+ return condMeets && sScriptMgr->OnConditionCheck(this, sourceInfo); // Returns true by default.;
}
uint32 Condition::GetSearcherTypeMaskForCondition() const
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d10b55b1473..1cee345fbff 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3147,15 +3147,6 @@ void Spell::EffectScriptEffect()
unitTarget->RemoveMovementImpairingAuras(true);
break;
}
- // Plant Warmaul Ogre Banner
- case 32307:
- if (Player* caster = m_caster->ToPlayer())
- {
- caster->RewardPlayerAndGroupAtEvent(18388, unitTarget);
- if (Creature* target = unitTarget->ToCreature())
- target->DespawnOrUnsummon();
- }
- break;
// Mug Transformation
case 41931:
{
diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp
index 84578db564f..64ef920e6ab 100644
--- a/src/server/scripts/Outland/zone_nagrand.cpp
+++ b/src/server/scripts/Outland/zone_nagrand.cpp
@@ -240,7 +240,6 @@ public:
void JustEngagedWith(Unit* /*who*/) override { }
void MoveInLineOfSight(Unit* who) override
-
{
if (!who)
return;
@@ -635,6 +634,292 @@ class go_warmaul_prison : public GameObjectScript
}
};
+enum PlantBannerQuests
+{
+ SPELL_PLANT_WARMAUL_OGRE_BANNER = 32307,
+ SPELL_PLANT_KIL_SORROW_BANNER = 32314,
+
+ NPC_KIL_SORROW_SPELLBINDER = 17146,
+ NPC_KIL_SORROW_CULTIST = 17147,
+ NPC_KIL_SORROW_DEATHSWORN = 17148,
+ NPC_GISELDA_THE_CRONE = 18391,
+ NPC_WARMAUL_REAVER = 17138,
+ NPC_WARMAUL_SHAMAN = 18064
+};
+
+class npc_nagrand_banner : public CreatureScript
+{
+public:
+ npc_nagrand_banner() : CreatureScript("npc_nagrand_banner") { }
+
+ struct npc_nagrand_bannerAI : public ScriptedAI
+ {
+ npc_nagrand_bannerAI(Creature* creature) : ScriptedAI(creature), bannered(false)
+ {
+ scheduler.SetValidator([this]
+ {
+ return !me->HasUnitState(UNIT_STATE_CASTING);
+ });
+ }
+
+ void Reset() override
+ {
+ scheduler.CancelAll();
+ }
+
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == SPELL_PLANT_WARMAUL_OGRE_BANNER || spellInfo->Id == SPELL_PLANT_KIL_SORROW_BANNER)
+ bannered = true;
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ scheduler.Update(diff, [this]
+ {
+ DoMeleeAttackIfReady();
+ });
+ }
+
+ bool IsBannered()
+ {
+ return bannered;
+ }
+
+ protected:
+ TaskScheduler scheduler;
+
+ private:
+ bool bannered;
+ };
+
+ struct npc_kil_sorrow_spellbinderAI : public npc_nagrand_bannerAI
+ {
+ enum KilSorrowSpellBinder
+ {
+ SPELL_ARCANE_MISSILES = 34447,
+ SPELL_CHAINS_OF_ICE = 22744,
+ SPELL_COUNTERSPELL = 31999
+ };
+
+ npc_kil_sorrow_spellbinderAI(Creature* creature) : npc_nagrand_bannerAI(creature), has_fled(false), interrupt_cooldown(20000)
+ {
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ has_fled = false;
+ interrupt_cooldown = 20000;
+ scheduler
+ .Schedule(Seconds(0), [this](TaskContext ArcaneMissiles)
+ {
+ DoCastVictim(SPELL_ARCANE_MISSILES);
+ ArcaneMissiles.Repeat(Milliseconds(2400), Milliseconds(3800));
+ })
+ .Schedule(Seconds(3), Seconds(6), [this](TaskContext ChainsOfIce)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_CHAINS_OF_ICE, true);
+ ChainsOfIce.Repeat(Seconds(20),Seconds(25));
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ interrupt_cooldown += diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ if (me->GetVictim()->HasUnitState(UNIT_STATE_CASTING) && interrupt_cooldown > 25000)
+ {
+ DoCastVictim(SPELL_COUNTERSPELL);
+ interrupt_cooldown = 0;
+ }
+
+ scheduler.Update(diff, [this]
+ {
+ DoMeleeAttackIfReady();
+ });
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (!has_fled && me->GetHealth() > damage && me->HealthBelowPctDamaged(15, damage))
+ {
+ me->DoFleeToGetAssistance();
+ has_fled = true;
+ }
+ }
+
+ private:
+ bool has_fled;
+ uint32 interrupt_cooldown;
+ };
+
+ struct npc_kil_sorrow_cultistAI : public npc_nagrand_bannerAI
+ {
+ enum KilSorrowCultist
+ {
+ SPELL_MIND_SEAR = 32000
+ };
+
+ npc_kil_sorrow_cultistAI(Creature* creature) : npc_nagrand_bannerAI(creature)
+ {
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ scheduler
+ .Schedule(Milliseconds(4500), [this](TaskContext MindSear)
+ {
+ DoCastVictim(SPELL_MIND_SEAR);
+ MindSear.Repeat(Milliseconds(7000), Milliseconds(11000));
+ });
+ }
+ };
+
+ struct npc_kil_sorrow_deathswornAI : public npc_nagrand_bannerAI
+ {
+ enum KilSorrowDeathsworn
+ {
+ SPELL_BLOODTHIRST = 31996
+ };
+
+ npc_kil_sorrow_deathswornAI(Creature* creature) : npc_nagrand_bannerAI(creature), used_bloodthirst(false)
+ {
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ used_bloodthirst = false;
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (!used_bloodthirst && me->GetHealth() > damage && me->HealthBelowPctDamaged(50, damage))
+ {
+ DoCastVictim(SPELL_BLOODTHIRST);
+ used_bloodthirst = true;
+ }
+ }
+
+ private:
+ bool used_bloodthirst;
+ };
+
+ struct npc_giselda_the_croneAI : public npc_nagrand_bannerAI
+ {
+ enum GiseldaTheCrone
+ {
+ SPELL_GISELDA_TRANSFORM_DND = 33316
+ };
+
+ npc_giselda_the_croneAI(Creature* creature) : npc_nagrand_bannerAI(creature), used_transform(false)
+ {
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ used_transform = false;
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (!used_transform && me->GetHealth() > damage && me->HealthBelowPctDamaged(65, damage))
+ {
+ DoCastVictim(SPELL_GISELDA_TRANSFORM_DND);
+ used_transform = true;
+ }
+ }
+
+ private:
+ bool used_transform;
+ };
+
+ struct npc_warmaul_shamanAI : public npc_nagrand_bannerAI
+ {
+ enum WarmaulShaman
+ {
+ SPELL_SCORCHING_TOTEM = 15038,
+ SPELL_FROST_SHOCK = 12548,
+ SPELL_HEALING_WAVE = 11986
+ };
+
+ npc_warmaul_shamanAI(Creature* creature) : npc_nagrand_bannerAI(creature), used_healing(false)
+ {
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ used_healing = false;
+ scheduler
+ .Schedule(Seconds(2), [this](TaskContext /*SearingTotem*/)
+ {
+ DoCast(SPELL_SCORCHING_TOTEM);
+ })
+ .Schedule(Seconds(6), [this](TaskContext FrostShock)
+ {
+ DoCastVictim(SPELL_FROST_SHOCK);
+ FrostShock.Repeat(Seconds(12));
+ });
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (!used_healing && me->GetHealth() > damage && me->HealthBelowPctDamaged(50, damage))
+ {
+ DoCastSelf(SPELL_HEALING_WAVE);
+ used_healing = true;
+ }
+ }
+
+ private:
+ uint32 used_healing;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_KIL_SORROW_SPELLBINDER:
+ return new npc_kil_sorrow_spellbinderAI(creature);
+ case NPC_KIL_SORROW_CULTIST:
+ return new npc_kil_sorrow_cultistAI(creature);
+ case NPC_KIL_SORROW_DEATHSWORN:
+ return new npc_kil_sorrow_deathswornAI(creature);
+ case NPC_GISELDA_THE_CRONE:
+ return new npc_giselda_the_croneAI(creature);
+ case NPC_WARMAUL_SHAMAN:
+ return new npc_warmaul_shamanAI(creature);
+ default:
+ return new npc_nagrand_bannerAI(creature);
+ }
+ }
+};
+
+class condition_nagrand_banner : public ConditionScript
+{
+public:
+ condition_nagrand_banner() : ConditionScript("conditition_nagrand_banner") {}
+
+ bool OnConditionCheck(Condition const* condition, ConditionSourceInfo& sourceInfo) override
+ {
+ WorldObject* target = sourceInfo.mConditionTargets[condition->ConditionTarget];
+ if (Creature* creature = target->ToCreature())
+ {
+ if (npc_nagrand_banner::npc_nagrand_bannerAI *ai = CAST_AI(npc_nagrand_banner::npc_nagrand_bannerAI, creature->AI()))
+ return !ai->IsBannered();
+ }
+ return false;
+ }
+};
+
void AddSC_nagrand()
{
new npc_maghar_captive();
@@ -643,4 +928,6 @@ void AddSC_nagrand()
new go_corkis_prison();
new npc_kurenai_captive();
new go_warmaul_prison();
+ new npc_nagrand_banner();
+ new condition_nagrand_banner();
}