aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2016_99_99_99_world.sql5
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp168
2 files changed, 86 insertions, 87 deletions
diff --git a/sql/updates/world/3.3.5/2016_99_99_99_world.sql b/sql/updates/world/3.3.5/2016_99_99_99_world.sql
new file mode 100644
index 00000000000..1551f6a646e
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_99_99_99_world.sql
@@ -0,0 +1,5 @@
+UPDATE `creature_template` SET `unit_flags`=64 WHERE `entry`=25740;
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=45947;
+DELETE FROM `creature_template_addon` WHERE `entry`=25754;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(25754,0,0,1,1,0,NULL);
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
index 5a7a7786c6a..431cd708fe9 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
@@ -73,6 +73,7 @@ enum Spells
SPELL_SLIPPERY_FLOOR_AMBIENT = 46314,
SPELL_SLIPPERY_FLOOR_PERIODIC = 46320,
SPELL_SLIPPERY_FLOOR_SLIP = 45947,
+ SPELL_SLIPPERY_FLOOR_YOU_SLIPPED = 45946,
// Frozen Core
SPELL_SUICIDE = 45254,
@@ -101,19 +102,18 @@ enum Events
EVENT_EMERGE = 1,
EVENT_INITIAL_EMERGE = 2,
EVENT_SYNCH_HEALTH = 3,
- EVENT_FOUND_OPENING = 4,
- EVENT_LOOKFOROPENING_0 = 5,
- EVENT_LOOKFOROPENING_1 = 6,
- EVENT_LOOKFOROPENING_2 = 7,
- EVENT_SUMMON_HAILSTONE = 8,
- EVENT_SUMMON_COLDWEAVE = 9,
- EVENT_SUMMON_FROSTWIND = 10,
- EVENT_SUMMON_AHUNE = 11,
- EVENT_CLOSE_OPENING = 12,
- EVENT_AHUNE_PHASE_ONE = 13,
- EVENT_AHUNE_PHASE_TWO = 14,
- EVENT_START_LOOKING_FOR_OPENING = 15,
- EVENT_STOP_LOOKING_FOR_OPENING = 16
+ EVENT_LOOKFOROPENING_0 = 4,
+ EVENT_LOOKFOROPENING_1 = 5,
+ EVENT_LOOKFOROPENING_2 = 6,
+ EVENT_SUMMON_HAILSTONE = 7,
+ EVENT_SUMMON_COLDWEAVE = 8,
+ EVENT_SUMMON_FROSTWIND = 9,
+ EVENT_SUMMON_AHUNE = 10,
+ EVENT_CLOSE_OPENING = 11,
+ EVENT_AHUNE_PHASE_ONE = 12,
+ EVENT_AHUNE_PHASE_TWO = 13,
+ EVENT_START_LOOKING_FOR_OPENING = 14,
+ EVENT_STOP_LOOKING_FOR_OPENING = 15
};
enum Actions
@@ -169,19 +169,14 @@ public:
{
boss_ahuneAI(Creature* creature) : BossAI(creature, DATA_AHUNE)
{
- Initialize();
- }
-
- void Initialize()
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_REMOVE_CLIENT_CONTROL);
+ me->SetControlled(true, UNIT_STATE_ROOT);
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
- events.ScheduleEvent(EVENT_INITIAL_EMERGE, 4);
- events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000);
+ events.ScheduleEvent(EVENT_INITIAL_EMERGE, Milliseconds(4));
+ events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3));
}
void EnterEvadeMode(EvadeReason /*why*/) override
@@ -194,7 +189,6 @@ public:
void JustDied(Unit* /*killer*/) override
{
- _JustDied();
instance->DoCastSpellOnPlayers(SPELL_AHUNE_ACHIEVEMENT);
if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY)))
@@ -209,11 +203,8 @@ public:
if (group->isLFGGroup())
sLFGMgr->FinishDungeon(group->GetGUID(), 286);
}
- }
- void JustSummoned(Creature* summon) override
- {
- BossAI::JustSummoned(summon);
+ _JustDied();
}
void DoAction(int32 action) override
@@ -221,7 +212,7 @@ public:
if (action == ACTION_AHUNE_RETREAT)
{
Submerge();
- events.ScheduleEvent(EVENT_EMERGE, 35000);
+ events.ScheduleEvent(EVENT_EMERGE, Seconds(35));
}
}
@@ -246,10 +237,10 @@ public:
break;
case EVENT_SYNCH_HEALTH:
if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
- DoCast(frozenCore, SPELL_SYNCH_HEALTH);
+ DoCast(frozenCore, SPELL_SYNCH_HEALTH, true);
else
DoCast(me, SPELL_SUICIDE);
- events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000);
+ events.Repeat(Seconds(3));
break;
default:
break;
@@ -268,8 +259,8 @@ public:
me->RemoveAurasDueToSpell(SPELL_STAY_SUBMERGED);
DoCast(me, SPELL_STAND);
DoCast(me, SPELL_RESURFACE, true);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3));
}
void Submerge()
@@ -277,7 +268,7 @@ public:
if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
frozenCore->AI()->DoAction(ACTION_AHUNE_RETREAT);
me->RemoveAurasDueToSpell(SPELL_AHUNES_SHIELD);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31);
DoCast(me, SPELL_SUBMERGED, true);
DoCast(me, SPELL_AHUNE_SELF_STUN, true);
DoCast(me, SPELL_STAY_SUBMERGED, true);
@@ -308,18 +299,11 @@ public:
void Initialize()
{
me->SetReactState(REACT_PASSIVE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_REMOVE_CLIENT_CONTROL);
+ me->setRegeneratingHealth(false);
DoCast(me, SPELL_FROZEN_CORE_GETS_HIT);
DoCast(me, SPELL_ICE_SPEAR_AURA);
}
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- DoCast(SPELL_MINION_DESPAWNER);
- if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
- ahune->AI()->EnterEvadeMode();
- }
-
void JustDied(Unit* /*killer*/) override
{
if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
@@ -333,23 +317,20 @@ public:
{
if (action == ACTION_AHUNE_RETREAT)
{
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
me->RemoveAurasDueToSpell(SPELL_ICE_SPEAR_AURA);
- _events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000, 0, PHASE_TWO);
+ _events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3), 0, PHASE_TWO);
}
else if (action == ACTION_AHUNE_RESURFACE)
{
_events.Reset();
DoCast(me, SPELL_ICE_SPEAR_AURA);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_REMOVE_CLIENT_CONTROL);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
}
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim())
- return;
-
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
@@ -358,10 +339,10 @@ public:
{
case EVENT_SYNCH_HEALTH:
if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
- DoCast(ahune, SPELL_SYNCH_HEALTH);
+ DoCast(ahune, SPELL_SYNCH_HEALTH, true);
else
DoCast(me, SPELL_SUICIDE);
- _events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000);
+ _events.Repeat(Seconds(3));
break;
default:
break;
@@ -435,11 +416,11 @@ public:
_submerged = false;
_events.Reset();
_events.SetPhase(PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_AHUNE, 10000);
- _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 14000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 22000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 14000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 108000, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_AHUNE, Seconds(10));
+ _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, Seconds(14), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, Seconds(22), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, Seconds(14), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, Seconds(108), 0, PHASE_ONE);
}
}
@@ -466,9 +447,9 @@ public:
case EVENT_SUMMON_COLDWEAVE:
DoCast(SPELL_SUMMON_COLDWEAVE);
DoCast(SPELL_SUMMON_COLDWEAVE);
- _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8000, 0, PHASE_ONE);
+ _events.Repeat(Seconds(8));
if (_submerged)
- _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 4000, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, Seconds(4), 0, PHASE_ONE);
break;
case EVENT_SUMMON_FROSTWIND:
DoCast(SPELL_SUMMON_FROSTWIND);
@@ -494,17 +475,17 @@ public:
ahune->AI()->DoAction(ACTION_AHUNE_RETREAT);
_events.Reset();
_events.SetPhase(PHASE_TWO);
- _events.ScheduleEvent(EVENT_CLOSE_OPENING, 25000, 0, PHASE_TWO);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, 35000, 0, PHASE_TWO);
+ _events.ScheduleEvent(EVENT_CLOSE_OPENING, Seconds(25), 0, PHASE_TWO);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, Seconds(35), 0, PHASE_TWO);
break;
case EVENT_AHUNE_PHASE_ONE:
_submerged = true;
_events.Reset();
_events.SetPhase(PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 5000, 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 100000, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, Seconds(8), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, Seconds(5), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, Seconds(5), 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, Seconds(100), 0, PHASE_ONE);
break;
default:
break;
@@ -581,10 +562,10 @@ public:
switch (spellInfo->Id)
{
case SPELL_SHAMANS_LOOK_FOR_OPENING:
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, 17000);
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, Seconds(17));
break;
case SPELL_FOUND_OPENING:
- _events.ScheduleEvent(EVENT_FOUND_OPENING, 0);
+ Talk(EMOTE_RETREAT);
break;
default:
break;
@@ -607,21 +588,19 @@ public:
{
case EVENT_LOOKFOROPENING_0:
LookOpening(true, 0);
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, 26000);
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, Seconds(26));
break;
case EVENT_LOOKFOROPENING_1:
LookOpening(true, 1);
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, 25000);
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, Seconds(25));
break;
case EVENT_LOOKFOROPENING_2:
LookOpening(true, 2);
- _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, 27000);
+ _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, Seconds(27));
break;
case EVENT_STOP_LOOKING_FOR_OPENING:
LookOpening(false, _mySpot);
break;
- case EVENT_FOUND_OPENING:
- Talk(EMOTE_RETREAT);
default:
break;
}
@@ -799,25 +778,26 @@ public:
void PeriodicTick(AuraEffect const* aurEff)
{
- if (Creature* caster = GetCaster()->ToCreature())
- switch (aurEff->GetTickNumber())
- {
- case 1:
- caster->CastSpell(caster, SPELL_SUMMON_ICE_SPEAR_GO);
- break;
- case 3:
- if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
- spike->UseDoorOrButton();
- caster->AI()->DoCastAOE(SPELL_ICE_SPEAR_KNOCKBACK, true);
- break;
- case 5:
- if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
- spike->Delete();
- caster->DespawnOrUnsummon();
- break;
- default:
- break;
- }
+ if (Unit* tmpCaster = GetCaster())
+ if (Creature* caster = tmpCaster->ToCreature())
+ switch (aurEff->GetTickNumber())
+ {
+ case 1:
+ caster->CastSpell(caster, SPELL_SUMMON_ICE_SPEAR_GO);
+ break;
+ case 3:
+ if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
+ spike->UseDoorOrButton();
+ caster->AI()->DoCastAOE(SPELL_ICE_SPEAR_KNOCKBACK, true);
+ break;
+ case 5:
+ if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
+ spike->Delete();
+ caster->DespawnOrUnsummon();
+ break;
+ default:
+ break;
+ }
}
void Register() override
@@ -884,6 +864,16 @@ public:
return true;
}
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ICE_SPEAR_BUNNY, true);
@@ -891,6 +881,7 @@ public:
void Register() override
{
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ice_spear_target_picker_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_ice_spear_target_picker_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -922,7 +913,10 @@ public:
{
if (Unit* target = GetHitUnit())
if (target->isMoving())
+ {
target->CastSpell(target, SPELL_SLIPPERY_FLOOR_SLIP, true);
+ target->CastSpell(target, SPELL_SLIPPERY_FLOOR_YOU_SLIPPED, true);
+ }
}
void Register() override