mirror of
https://github.com/azerothcore/azerothcore-wotlk.git
synced 2025-11-10 21:04:26 +08:00
Compare commits
6 Commits
7f846c629f
...
12e0376e23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12e0376e23 | ||
|
|
c85c86b285 | ||
|
|
125e1aec9d | ||
|
|
bef7204bb6 | ||
|
|
7a3e4066a3 | ||
|
|
75d64cc8f6 |
@ -0,0 +1,5 @@
|
||||
-- Remove SmartAI and add script name
|
||||
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_prismatic_exile' WHERE `entry` = 2887;
|
||||
|
||||
-- delete old smartscript
|
||||
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2887) AND (`source_type` = 0);
|
||||
@ -19586,12 +19586,6 @@ void Unit::_ExitVehicle(Position const* exitPosition)
|
||||
|
||||
sScriptMgr->AnticheatSetUnderACKmount(player);
|
||||
}
|
||||
else if (HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
|
||||
{
|
||||
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8);
|
||||
data << GetPackGUID();
|
||||
SendMessageToSet(&data, false);
|
||||
}
|
||||
|
||||
// xinef: hack for flameleviathan seat vehicle
|
||||
VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
|
||||
|
||||
@ -124,7 +124,105 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FIREBALL = 34083,
|
||||
SPELL_FROSTNOVA = 38033,
|
||||
SPELL_LIGHTNING_SHIELD = 12550,
|
||||
SPELL_VISUAL_TRANSFORMATION = 24085
|
||||
};
|
||||
|
||||
// Fire, Air, Water, earth model displayId (same as the elemental in the zone)
|
||||
uint32_t elements_display[] = {2172, 5490, 5561, 9587};
|
||||
class npc_prismatic_exile : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_prismatic_exile() : CreatureScript("npc_prismatic_exile") {}
|
||||
|
||||
struct npc_prismatic_exileAI : public ScriptedAI
|
||||
{
|
||||
uint32 changeElementTimer;
|
||||
uint32 currentElement;
|
||||
uint32 frostNovaTimer;
|
||||
bool hasLightningShield;
|
||||
|
||||
npc_prismatic_exileAI(Creature* creature) : ScriptedAI(creature) {
|
||||
currentElement = 3;
|
||||
hasLightningShield = false;
|
||||
frostNovaTimer = urand(1400, 7300); // Got those values from smart_script of 2761
|
||||
changeElementTimer = urand(6 * IN_MILLISECONDS, 10 * IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
// Get the target from Myzrael
|
||||
Unit* owner = me->GetOwner();
|
||||
if (!owner)
|
||||
return;
|
||||
|
||||
Unit* target = owner->GetVictim();
|
||||
if (target)
|
||||
SetGazeOn(target);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
// Change Element
|
||||
if (changeElementTimer <= diff)
|
||||
{
|
||||
uint32 _rand = urand(1, 3);
|
||||
me->CastStop();
|
||||
me->CastSpell(me, SPELL_VISUAL_TRANSFORMATION, true);
|
||||
currentElement = (currentElement + _rand) % 4; // Change to a new element different from actual one
|
||||
me->SetDisplayId(elements_display[currentElement]);
|
||||
changeElementTimer = urand(6 * IN_MILLISECONDS, 10 * IN_MILLISECONDS);
|
||||
}
|
||||
else changeElementTimer -= diff;
|
||||
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
// Cast spell depending on the current element
|
||||
switch (currentElement) {
|
||||
case 0: // FIRE
|
||||
// Always cast fire ball
|
||||
me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false);
|
||||
return;
|
||||
case 1: // AIR
|
||||
// Can only cast lightning shield once
|
||||
if (!hasLightningShield)
|
||||
{
|
||||
me->CastSpell(me, SPELL_LIGHTNING_SHIELD, false);
|
||||
hasLightningShield = true;
|
||||
}
|
||||
break;
|
||||
case 2: // WATER
|
||||
// Can only case frostnova if is in range and timer is done
|
||||
Unit * target = me->GetVictim();
|
||||
if (target && me->IsInRange(target, 0.0f, 10.0f) && frostNovaTimer <= diff)
|
||||
{
|
||||
me->CastSpell((Unit*)nullptr, SPELL_FROSTNOVA, false);
|
||||
frostNovaTimer = urand(1400, 7300);
|
||||
}
|
||||
else frostNovaTimer -= diff;
|
||||
break;
|
||||
}
|
||||
|
||||
// By default, melee attack
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_prismatic_exileAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_arathi_highlands()
|
||||
{
|
||||
new npc_prismatic_exile();
|
||||
new npc_professor_phizzlethorpe();
|
||||
}
|
||||
|
||||
@ -133,13 +133,13 @@ struct boss_anub_arak : public BossAI
|
||||
DoCastSelf(SPELL_IMPALE_PERIODIC, true);
|
||||
|
||||
++_submergePhase;
|
||||
events.Reset();
|
||||
ScheduleSubmerged();
|
||||
}
|
||||
}
|
||||
|
||||
void ScheduleEmerged()
|
||||
{
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETLES, 6500ms, 0, PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED);
|
||||
@ -148,7 +148,6 @@ struct boss_anub_arak : public BossAI
|
||||
|
||||
void ScheduleSubmerged()
|
||||
{
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_EMERGE, 60s, 0, PHASE_SUBMERGED);
|
||||
|
||||
@ -209,14 +208,13 @@ struct boss_anub_arak : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
events.SetPhase(PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s, 0, PHASE_EMERGED);
|
||||
ScheduleEmerged();
|
||||
|
||||
// set up world triggers
|
||||
@ -288,7 +286,8 @@ struct boss_anub_arak : public BossAI
|
||||
if (_remainingLargeSummonsBeforeEmerge == 0)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_EMERGE, 5s);
|
||||
events.SetPhase(PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_EMERGE, 5s, 0, PHASE_SUBMERGED);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -333,10 +332,10 @@ struct boss_anub_arak : public BossAI
|
||||
DoCastSelf(SPELL_SELF_ROOT, true);
|
||||
me->DisableRotate(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms);
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms, 0, PHASE_EMERGED);
|
||||
DoCast(target, SPELL_POUND);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_POUND, 18s);
|
||||
events.ScheduleEvent(EVENT_POUND, 18s, 0, PHASE_EMERGED);
|
||||
break;
|
||||
case EVENT_ENABLE_ROTATE:
|
||||
me->RemoveAurasDueToSpell(SPELL_SELF_ROOT);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user