Scripts/AhnKahet: Elder Nadox

* replaced egg core script with db content
* removed useless spellscript for Guardian Aura
* fixed Swarm aura
* Patch 3.3.2 (2010-01-02): Elder Nadox now only gets one Ahn'Kahar Guardian during the encounter.

Closes #12506
This commit is contained in:
joschiwald
2014-07-19 20:30:13 +02:00
parent 318019d18b
commit 297e63da36
2 changed files with 102 additions and 93 deletions

View File

@@ -0,0 +1,24 @@
UPDATE `creature_template` SET `AIName`='PassiveAI', `ScriptName`='', `flags_extra`=0 WHERE `entry` IN (30172,30173);
DELETE FROM `spell_script_names` WHERE `ScriptName` LIKE 'spell_elder_nadox_guardian';
DELETE FROM `spell_script_names` WHERE `spell_id`=56159;
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(56159,'spell_ahn_kahet_swarm');
DELETE FROM `creature_template_addon` WHERE `entry` IN (30176,30178,30338,31441,31448,31447);
INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
(30176, 0, 0x0, 0x1, '56151'),
(30178, 0, 0x0, 0x1, '56158'),
(30338, 0, 0x0, 0x1, '56158'),
(31441, 0, 0x0, 0x1, '56151'),
(31448, 0, 0x0, 0x1, '56158'),
(31447, 0, 0x0, 0x1, '56158');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56159;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,56159,0,0,31,0,3,30178,0,0,0,0,'','Swarm can only target Ahn''kahar Swarmer'),
(13,1,56159,0,1,31,0,3,30338,0,0,0,0,'','Swarm can only target Ahn''kahar Swarmer');
DELETE FROM `smart_scripts` WHERE `entryorguid`=30338 AND `source_type`=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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(30338,0,0,0,0,0,100,0,1000,1000,35000,45000,11,56354,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ahn''kahar Swarmer - In Combat - Cast ''Sprint''');

View File

@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellAuras.h"
#include "SpellScript.h"
#include "ahnkahet.h"
@@ -31,14 +32,16 @@ enum Yells
enum Spells
{
// Elder Nadox
SPELL_BROOD_PLAGUE = 56130,
H_SPELL_BROOD_RAGE = 59465,
SPELL_ENRAGE = 26662, // Enraged if too far away from home
SPELL_SUMMON_SWARMERS = 56119, // 2x 30178 -- 2x every 10secs
SPELL_SUMMON_SWARM_GUARD = 56120, // 1x 30176 -- every 25%
// Spells Adds
SPELL_SPRINT = 56354,
SPELL_GUARDIAN_AURA = 56151
SPELL_SUMMON_SWARM_GUARD = 56120, // 1x 30176
// Adds
SPELL_SWARM_BUFF = 56281,
SPELL_SPRINT = 56354
};
enum Events
@@ -63,7 +66,7 @@ class boss_elder_nadox : public CreatureScript
void Reset() override
{
_Reset();
AmountHealthModifier = 1;
GuardianSummoned = false;
GuardianDied = false;
}
@@ -128,6 +131,7 @@ class boss_elder_nadox : public CreatureScript
events.ScheduleEvent(EVENT_RAGE, urand(10 * IN_MILLISECONDS, 50 * IN_MILLISECONDS));
break;
case EVENT_SUMMON_SWARMER:
/// @todo: summoned by egg
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
Talk(SAY_EGG_SAC);
@@ -145,19 +149,20 @@ class boss_elder_nadox : public CreatureScript
}
}
if (me->HealthBelowPct(100 - AmountHealthModifier * 25))
if (!GuardianSummoned && me->HealthBelowPct(50))
{
/// @todo: summoned by egg
Talk(EMOTE_HATCHES, me);
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
++AmountHealthModifier;
GuardianSummoned = true;
}
DoMeleeAttackIfReady();
}
private:
bool GuardianSummoned;
bool GuardianDied;
uint8 AmountHealthModifier;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -175,20 +180,10 @@ class npc_ahnkahar_nerubian : public CreatureScript
{
npc_ahnkahar_nerubianAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
void Reset() override
{
if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
DoCast(me, SPELL_GUARDIAN_AURA, true);
events.ScheduleEvent(EVENT_SPRINT, 13 * IN_MILLISECONDS);
}
void JustDied(Unit* /*killer*/) override
{
if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
_events.Reset();
_events.ScheduleEvent(EVENT_SPRINT, 13 * IN_MILLISECONDS);
}
void UpdateAI(uint32 diff) override
@@ -196,23 +191,27 @@ class npc_ahnkahar_nerubian : public CreatureScript
if (!UpdateVictim())
return;
events.Update(diff);
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SPRINT:
DoCast(me, SPELL_SPRINT);
events.ScheduleEvent(EVENT_SPRINT, 20 * IN_MILLISECONDS);
break;
case EVENT_SPRINT:
DoCast(me, SPELL_SPRINT);
_events.ScheduleEvent(EVENT_SPRINT, 20 * IN_MILLISECONDS);
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -221,95 +220,81 @@ class npc_ahnkahar_nerubian : public CreatureScript
}
};
//HACK: No, AI. Replace with proper db content?
class npc_nadox_eggs : public CreatureScript
// 56159 - Swarm
class spell_ahn_kahet_swarm : public SpellScriptLoader
{
public:
npc_nadox_eggs() : CreatureScript("npc_nadox_eggs") { }
public:
spell_ahn_kahet_swarm() : SpellScriptLoader("spell_ahn_kahet_swarm") { }
struct npc_nadox_eggsAI : public ScriptedAI
{
npc_nadox_eggsAI(Creature* creature) : ScriptedAI(creature)
class spell_ahn_kahet_swarm_SpellScript : public SpellScript
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
}
PrepareSpellScript(spell_ahn_kahet_swarm_SpellScript);
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
void AttackStart(Unit* /*victim*/) override { }
void MoveInLineOfSight(Unit* /*who*/) override { }
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_SWARM_BUFF))
return false;
return true;
}
void UpdateAI(uint32 /*diff*/) override { }
};
bool Load() override
{
_targetCount = 0;
return true;
}
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_nadox_eggsAI(creature);
}
};
void CountTargets(std::list<WorldObject*>& targets)
{
_targetCount = targets.size();
}
class GuardianCheck
{
public:
bool operator()(const WorldObject* target) const
{
if (target->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
return true;
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (_targetCount)
{
if (Aura* aura = GetCaster()->GetAura(SPELL_SWARM_BUFF))
{
aura->SetStackAmount(_targetCount);
aura->RefreshDuration();
}
else
GetCaster()->CastCustomSpell(SPELL_SWARM_BUFF, SPELLVALUE_AURA_STACK, _targetCount, GetCaster(), TRIGGERED_FULL_MASK);
}
else
GetCaster()->RemoveAurasDueToSpell(SPELL_SWARM_BUFF);
}
return false;
}
};
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ahn_kahet_swarm_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
OnEffectHit += SpellEffectFn(spell_ahn_kahet_swarm_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
class spell_elder_nadox_guardian : public SpellScriptLoader
{
public:
spell_elder_nadox_guardian() : SpellScriptLoader("spell_elder_nadox_guardian") { }
private:
uint32 _targetCount;
};
class spell_elder_nadox_guardian_SpellScript : public SpellScript
{
PrepareSpellScript(spell_elder_nadox_guardian_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
SpellScript* GetSpellScript() const override
{
targets.remove_if(GuardianCheck());
return new spell_ahn_kahet_swarm_SpellScript();
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_elder_nadox_guardian_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_elder_nadox_guardian_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_elder_nadox_guardian_SpellScript();
}
};
class achievement_respect_your_elders : public AchievementCriteriaScript
{
public:
achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders") { }
public:
achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders") { }
bool OnCheck(Player* /*player*/, Unit* target) override
{
if (!target)
return false;
if (Creature* Nadox = target->ToCreature())
if (Nadox->AI()->GetData(DATA_RESPECT_YOUR_ELDERS))
return true;
return false;
}
bool OnCheck(Player* /*player*/, Unit* target) override
{
return target && target->GetAI()->GetData(DATA_RESPECT_YOUR_ELDERS);
}
};
void AddSC_boss_elder_nadox()
{
new boss_elder_nadox();
new npc_ahnkahar_nerubian();
new npc_nadox_eggs();
new spell_elder_nadox_guardian();
new spell_ahn_kahet_swarm();
new achievement_respect_your_elders();
}