mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-06 04:23:47 +00:00
fix(Scripts/SSC): Respawn Leotheras and fix last phase transition (#17720)
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
--
|
||||
SET @CGUID := 15013;
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+3;
|
||||
INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `unit_flags`, `dynamicflags`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
(@CGUID+0, 21806, 548, 3607, 3607, 1, 1, 0, 369.23431396484375, -446.472564697265625, 29.6020355224609375, 0.820574045181274414, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1
|
||||
(@CGUID+1, 21806, 548, 3607, 3607, 1, 1, 0, 385.1583251953125, -441.596710205078125, 29.61212921142578125, 2.810055494308471679, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1
|
||||
(@CGUID+2, 21806, 548, 3607, 3607, 1, 1, 0, 373.21923828125, -429.14776611328125, 29.60641860961914062, 5.049488067626953125, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1
|
||||
(@CGUID+3, 21215, 548, 3607, 3607, 1, 1, 0, 376.5428466796875, -438.630889892578125, 29.60830116271972656, 2.670353651046752929, 7200, 0, 0, 0, 0, 0, 0, 0, 1, 52148); -- 21215 (Area: 3607 - Difficulty: 4) CreateObject1 (Auras: 37546 - 37546)
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` = @CGUID+3;
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
|
||||
(@CGUID+3, 0, 0, 8, 1, '37546'); -- 21215 - 37546 - 37546
|
||||
|
||||
DELETE FROM `creature_formations` WHERE `leaderGUID` = @CGUID+3;
|
||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
|
||||
(@CGUID+3, @CGUID+3, 0, 0, 24, 0, 0),
|
||||
(@CGUID+3, @CGUID+0, 0, 0, 24, 0, 0),
|
||||
(@CGUID+3, @CGUID+1, 0, 0, 24, 0, 0),
|
||||
(@CGUID+3, @CGUID+2, 0, 0, 24, 0, 0);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21806) AND (`source_type` = 0) AND (`id` IN (4));
|
||||
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`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(21806, 0, 4, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 205, 2, 1, 0, 0, 0, 0, 0, 0, 'Greyheart Spellbinder - On Just Died - Do Action ID 1 (ACTION_CHECK_SPELLBINDERS)');
|
||||
@@ -15,6 +15,7 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "CreatureGroups.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
@@ -56,10 +57,10 @@ enum Spells
|
||||
|
||||
enum Misc
|
||||
{
|
||||
MAX_CHANNELERS = 3,
|
||||
|
||||
NPC_GREYHEART_SPELLBINDER = 21806,
|
||||
NPC_SHADOW_OF_LEOTHERAS = 21875,
|
||||
NPC_GREYHEART_SPELLBINDER = 21806,
|
||||
|
||||
ACTION_CHECK_SPELLBINDERS = 1
|
||||
};
|
||||
|
||||
enum Groups
|
||||
@@ -68,35 +69,21 @@ enum Groups
|
||||
GROUP_DEMON = 2
|
||||
};
|
||||
|
||||
const Position channelersPos[MAX_CHANNELERS] =
|
||||
{
|
||||
{367.11f, -421.48f, 29.52f, 5.0f},
|
||||
{380.11f, -435.48f, 29.52f, 2.5f},
|
||||
{362.11f, -437.48f, 29.52f, 0.9f}
|
||||
};
|
||||
|
||||
struct boss_leotheras_the_blind : public BossAI
|
||||
{
|
||||
boss_leotheras_the_blind(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND)
|
||||
{
|
||||
scheduler.SetValidator([this]
|
||||
{
|
||||
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||
});
|
||||
}
|
||||
boss_leotheras_the_blind(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCastSelf(SPELL_CLEAR_CONSUMING_MADNESS, true);
|
||||
DoCastSelf(SPELL_DUAL_WIELD, true);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->LoadEquipment(0, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
_recentlySpoken = false;
|
||||
SummonChannelers();
|
||||
|
||||
ScheduleHealthCheckEvent(15, [&]{
|
||||
me->RemoveAurasDueToSpell(SPELL_WHIRLWIND);
|
||||
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
//is currently in metamorphosis
|
||||
@@ -104,12 +91,17 @@ struct boss_leotheras_the_blind : public BossAI
|
||||
me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
|
||||
scheduler.RescheduleGroup(GROUP_COMBAT, 10s);
|
||||
}
|
||||
|
||||
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
DoResetThreatList();
|
||||
me->ClearTarget();
|
||||
me->SendMeleeAttackStop();
|
||||
scheduler.CancelGroup(GROUP_DEMON);
|
||||
scheduler.DelayAll(10s);
|
||||
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->StopMoving();
|
||||
Talk(SAY_FINAL_FORM);
|
||||
@@ -119,52 +111,41 @@ struct boss_leotheras_the_blind : public BossAI
|
||||
DoCastSelf(SPELL_SUMMON_SHADOW_OF_LEOTHERAS);
|
||||
}).Schedule(6s, [this](TaskContext)
|
||||
{
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
me->ResumeChasingVictim();
|
||||
|
||||
if (me->GetVictim())
|
||||
{
|
||||
me->SetTarget(me->GetVictim()->GetGUID());
|
||||
me->SendMeleeAttackStart(me->GetVictim());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
void DoAction(int32 actionId) override
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false);
|
||||
DoCastSelf(SPELL_BANISH);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
|
||||
|
||||
//probably needs a spell instead
|
||||
summons.DespawnAll();
|
||||
for (uint8 i = 0; i < MAX_CHANNELERS; ++i)
|
||||
if (actionId == ACTION_CHECK_SPELLBINDERS)
|
||||
{
|
||||
me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*) override
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER)
|
||||
{
|
||||
if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER))
|
||||
if (CreatureGroup* formation = me->GetFormation())
|
||||
{
|
||||
me->RemoveAllAuras();
|
||||
me->LoadEquipment();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
scheduler.Schedule(10min, [this](TaskContext)
|
||||
if (!formation->IsAnyMemberAlive(true))
|
||||
{
|
||||
DoCastSelf(SPELL_BERSERK);
|
||||
});
|
||||
me->RemoveAllAuras();
|
||||
me->LoadEquipment();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
ElfTime();
|
||||
scheduler.Schedule(10min, [this](TaskContext)
|
||||
{
|
||||
DoCastSelf(SPELL_BERSERK);
|
||||
});
|
||||
|
||||
ElfTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -219,12 +200,22 @@ struct boss_leotheras_the_blind : public BossAI
|
||||
|
||||
if (me->GetDisplayId() == me->GetNativeDisplayId())
|
||||
{
|
||||
DoMeleeAttackIfReady();
|
||||
if (me->GetReactState() != REACT_PASSIVE)
|
||||
{
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
else if (me->isAttackReady(BASE_ATTACK))
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false);
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
if (DoCastVictim(SPELL_CHAOS_BLAST) != SPELL_CAST_OK)
|
||||
{
|
||||
// Auto-attacks if there are no valid targets to cast his spell on f.e pet taunted.
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
}
|
||||
}
|
||||
}
|
||||
private:
|
||||
|
||||
@@ -31,6 +31,7 @@ DoorData const doorData[] =
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_LEOTHERAS_THE_BLIND, DATA_LEOTHERAS_THE_BLIND },
|
||||
{ NPC_FATHOM_LORD_KARATHRESS, DATA_FATHOM_LORD_KARATHRESS },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user