Merge branch 'azerothcore:master' into Playerbot

This commit is contained in:
ZhengPeiRu21
2023-04-16 20:27:56 -06:00
committed by GitHub
17 changed files with 265 additions and 248 deletions

View File

@@ -891,7 +891,7 @@ public:
}
// Original TC Notes from Refactor vvv
//ToDo: use a new trinity_string for this commands
//ToDo: use a new acore_string for this commands
handler->PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS);
return true;

View File

@@ -587,7 +587,7 @@ public:
}
}
// tc use updateAI, while we have movementinform :)
// tc use updateAI, while we have movementinform
void MovementInform(uint32 type, uint32 /*param*/) override
{
if (type == POINT_MOTION_TYPE)
@@ -787,7 +787,7 @@ public:
}
}
// tc they use updateAI, while we have movementinform :)
// tc they use updateAI, while we have movementinform
void MovementInform(uint32 type, uint32 /*param*/) override
{
if (type == POINT_MOTION_TYPE)

View File

@@ -42,217 +42,194 @@ enum eEnums
SOUND_INTRO = 9349
};
class boss_ambassador_hellmaw : public CreatureScript
struct boss_ambassador_hellmaw : public BossAI
{
public:
boss_ambassador_hellmaw() : CreatureScript("boss_ambassador_hellmaw") { }
boss_ambassador_hellmaw(Creature* creature) : BossAI(creature, TYPE_HELLMAW) { }
CreatureAI* GetAI(Creature* creature) const override
bool isBanished;
void InitializeAI() override
{
return GetShadowLabyrinthAI<boss_ambassador_hellmawAI>(creature);
}
Reset();
struct boss_ambassador_hellmawAI : public ScriptedAI
{
boss_ambassador_hellmawAI(Creature* creature) : ScriptedAI(creature)
if (instance->GetData(TYPE_RITUALISTS) != DONE)
{
instance = creature->GetInstanceScript();
isBanished = true;
me->SetImmuneToAll(true);
me->m_Events.AddEventAtOffset([this]()
{
DoCastSelf(SPELL_BANISH, true);
}, 500ms);
}
InstanceScript* instance;
EventMap events;
bool isBanished;
void InitializeAI() override
else
{
Reset();
if (instance && instance->GetData(TYPE_RITUALISTS) != DONE)
{
isBanished = true;
me->SetImmuneToAll(true);
me->m_Events.AddEventAtOffset([this]()
{
DoCastSelf(SPELL_BANISH, true);
}, 500ms);
}
else
{
me->GetMotionMaster()->MovePath(PATH_ID_START, false);
}
}
void Reset() override
{
events.Reset();
isBanished = false;
me->SetImmuneToAll(false);
if (instance)
{
instance->SetData(TYPE_HELLMAW, NOT_STARTED);
}
}
void DoAction(int32 param) override
{
if (param != 1)
{
return;
}
me->RemoveAurasDueToSpell(SPELL_BANISH);
Talk(SAY_INTRO);
DoPlaySoundToSet(me, SOUND_INTRO);
isBanished = false;
me->SetImmuneToAll(false);
me->GetMotionMaster()->MovePath(PATH_ID_START, false);
}
}
void JustEngagedWith(Unit*) override
void Reset() override
{
_Reset();
isBanished = false;
me->SetImmuneToAll(false);
}
void DoAction(int32 param) override
{
if (param != 1)
{
if (isBanished)
{
return;
}
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CORROSIVE, urand(5000, 10000));
events.ScheduleEvent(EVENT_SPELL_FEAR, urand(15000, 20000));
if (IsHeroic())
{
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 180000);
}
if (instance)
{
instance->SetData(TYPE_HELLMAW, IN_PROGRESS);
}
return;
}
void MoveInLineOfSight(Unit* who) override
{
if (isBanished)
{
return;
}
me->RemoveAurasDueToSpell(SPELL_BANISH);
Talk(SAY_INTRO);
DoPlaySoundToSet(me, SOUND_INTRO);
isBanished = false;
me->SetImmuneToAll(false);
me->GetMotionMaster()->MovePath(PATH_ID_START, false);
}
ScriptedAI::MoveInLineOfSight(who);
void JustEngagedWith(Unit*) override
{
if (isBanished)
{
return;
}
void AttackStart(Unit* who) override
{
if (isBanished)
{
return;
}
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CORROSIVE, urand(5000, 10000));
ScriptedAI::AttackStart(who);
scheduler.Schedule(5s, 10s, [this](TaskContext context)
{
DoCastVictim(SPELL_CORROSIVE_ACID);
context.Repeat(15s, 25s);
}).Schedule(15s, 20s, [this](TaskContext context)
{
DoCastAOE(SPELL_FEAR);
context.Repeat(20s, 35s);
});
if (IsHeroic())
{
scheduler.Schedule(5min, [this](TaskContext)
{
DoCastSelf(SPELL_ENRAGE, true);
});
}
void PathEndReached(uint32 pathId) override
_JustEngagedWith();
}
void MoveInLineOfSight(Unit* who) override
{
if (isBanished)
{
if (pathId == PATH_ID_START)
return;
}
ScriptedAI::MoveInLineOfSight(who);
}
void AttackStart(Unit* who) override
{
if (isBanished)
{
return;
}
ScriptedAI::AttackStart(who);
}
void PathEndReached(uint32 pathId) override
{
if (pathId == PATH_ID_START)
{
me->m_Events.AddEventAtOffset([this]()
{
me->m_Events.AddEventAtOffset([this]()
me->GetMotionMaster()->MovePath(PATH_ID_PATHING, true);
}, 20s);
}
}
void KilledUnit(Unit* victim) override
{
if (victim->IsPlayer() && urand(0, 1))
{
Talk(SAY_SLAY);
}
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
}
bool CanAIAttack(Unit const* /*unit*/) const override
{
return !isBanished;
}
void DoMeleeAttackIfReady(bool ignoreCasting)
{
if (!ignoreCasting && me->HasUnitState(UNIT_STATE_CASTING))
{
return;
}
Unit* victim = me->GetVictim();
if (!victim || !victim->IsInWorld())
{
return;
}
if (!me->IsWithinMeleeRange(victim))
{
return;
}
//Make sure our attack is ready and we aren't currently casting before checking distance
if (me->isAttackReady())
{
// xinef: prevent base and off attack in same time, delay attack at 0.2 sec
if (me->haveOffhandWeapon())
{
if (me->getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
{
me->GetMotionMaster()->MovePath(PATH_ID_PATHING, true);
}, 20s);
}
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1))
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
if (instance)
instance->SetData(TYPE_HELLMAW, DONE);
}
bool CanAIAttack(Unit const* /*unit*/) const override
{
return !isBanished;
}
void DoMeleeAttackIfReady(bool ignoreCasting)
{
if (!ignoreCasting && me->HasUnitState(UNIT_STATE_CASTING))
{
return;
}
Unit* victim = me->GetVictim();
if (!victim || !victim->IsInWorld())
{
return;
}
if (!me->IsWithinMeleeRange(victim))
{
return;
}
//Make sure our attack is ready and we aren't currently casting before checking distance
if (me->isAttackReady())
{
// xinef: prevent base and off attack in same time, delay attack at 0.2 sec
if (me->haveOffhandWeapon())
{
if (me->getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
{
me->setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
}
me->setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
}
me->AttackerStateUpdate(victim, BASE_ATTACK, false, ignoreCasting);
me->resetAttackTimer();
}
if (me->haveOffhandWeapon() && me->isAttackReady(OFF_ATTACK))
{
// xinef: delay main hand attack if both will hit at the same time (players code)
if (me->getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
{
me->setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
}
me->AttackerStateUpdate(victim, OFF_ATTACK, false, ignoreCasting);
me->resetAttackTimer(OFF_ATTACK);
}
me->AttackerStateUpdate(victim, BASE_ATTACK, false, ignoreCasting);
me->resetAttackTimer();
}
void UpdateAI(uint32 diff) override
if (me->haveOffhandWeapon() && me->isAttackReady(OFF_ATTACK))
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (events.ExecuteEvent())
// xinef: delay main hand attack if both will hit at the same time (players code)
if (me->getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
{
case EVENT_SPELL_CORROSIVE:
me->CastSpell(me->GetVictim(), SPELL_CORROSIVE_ACID, false);
events.RepeatEvent(urand(15000, 25000));
break;
case EVENT_SPELL_FEAR:
me->CastSpell(me, SPELL_FEAR, false);
events.RepeatEvent(urand(20000, 35000));
break;
case EVENT_SPELL_ENRAGE:
me->CastSpell(me->GetVictim(), SPELL_ENRAGE, false);
break;
me->setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
}
DoMeleeAttackIfReady(me->FindCurrentSpellBySpellId(SPELL_CORROSIVE_ACID) != nullptr);
me->AttackerStateUpdate(victim, OFF_ATTACK, false, ignoreCasting);
me->resetAttackTimer(OFF_ATTACK);
}
};
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
scheduler.Update(diff);
DoMeleeAttackIfReady(me->FindCurrentSpellBySpellId(SPELL_CORROSIVE_ACID) != nullptr);
}
};
void AddSC_boss_ambassador_hellmaw()
{
new boss_ambassador_hellmaw();
RegisterShadowLabyrinthCreatureAI(boss_ambassador_hellmaw);
}

View File

@@ -50,4 +50,6 @@ inline AI* GetShadowLabyrinthAI(T* obj)
return GetInstanceAI<AI>(obj, ShadowLabyrinthScriptName);
}
#define RegisterShadowLabyrinthCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetShadowLabyrinthAI)
#endif

View File

@@ -126,9 +126,9 @@ struct boss_high_king_maulgar : public BossAI
_JustEngagedWith();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_ARCING_SMASH, 6s);
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 20s);
events.ScheduleEvent(EVENT_WHIRLWIND, 30s);
events.ScheduleEvent(EVENT_ARCING_SMASH, 10s);
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s);
events.ScheduleEvent(EVENT_WHIRLWIND, 54s);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500ms);
}
@@ -149,7 +149,7 @@ struct boss_high_king_maulgar : public BossAI
break;
case EVENT_MIGHTY_BLOW:
me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false);
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 16s);
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s);
break;
case EVENT_WHIRLWIND:
events.DelayEvents(15s);
@@ -214,9 +214,9 @@ struct boss_olm_the_summoner : public ScriptedAI
me->SetInCombatWithZone();
instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 10s);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 15s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 500ms);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 5s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 6500ms);
}
void JustDied(Unit* /*killer*/) override
@@ -241,19 +241,18 @@ struct boss_olm_the_summoner : public ScriptedAI
switch (events.ExecuteEvent())
{
case EVENT_ADD_ABILITY1:
DoCastVictim(SPELL_DARK_DECAY);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 7s);
me->CastSpell(me, SPELL_SUMMON_WFH, false);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 50s);
break;
case EVENT_ADD_ABILITY2:
me->CastSpell(me, SPELL_SUMMON_WFH, false);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 30s);
DoCastVictim(SPELL_DARK_DECAY);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 6500ms);
break;
case EVENT_ADD_ABILITY3:
DoCastRandomTarget(SPELL_DEATH_COIL);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 7s);
break;
}
DoMeleeAttackIfReady();
}
};
@@ -279,9 +278,9 @@ struct boss_kiggler_the_crazed : public ScriptedAI
me->SetInCombatWithZone();
instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 5s);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 10s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 1500ms);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 5s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 25s);
events.ScheduleEvent(EVENT_ADD_ABILITY4, 30s);
}
@@ -302,20 +301,23 @@ struct boss_kiggler_the_crazed : public ScriptedAI
switch (events.ExecuteEvent())
{
case EVENT_ADD_ABILITY1:
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1))
me->CastSpell(target, SPELL_GREATER_POLYMORPH, false);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 20s);
DoCastVictim(SPELL_LIGHTNING_BOLT);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 1500ms);
break;
case EVENT_ADD_ABILITY2:
DoCastVictim(SPELL_LIGHTNING_BOLT);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 1500ms);
DoCastVictim(SPELL_ARCANE_SHOCK);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 5s);
break;
case EVENT_ADD_ABILITY3:
DoCastVictim(SPELL_ARCANE_SHOCK);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1)) //target method should perhaps change
me->CastSpell(target, SPELL_GREATER_POLYMORPH, false);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 11s);
break;
case EVENT_ADD_ABILITY4:
DoCastAOE(SPELL_ARCANE_EXPLOSION);
if (me->SelectNearestPlayer(30.0f))
{
DoCastAOE(SPELL_ARCANE_EXPLOSION);
}
events.ScheduleEvent(EVENT_ADD_ABILITY4, 30s);
break;
}
@@ -345,9 +347,9 @@ struct boss_blindeye_the_seer : public ScriptedAI
me->SetInCombatWithZone();
instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 1700ms);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 10s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 11s);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 30s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 31s);
}
void JustDied(Unit* /*killer*/) override
@@ -367,15 +369,15 @@ struct boss_blindeye_the_seer : public ScriptedAI
switch (events.ExecuteEvent())
{
case EVENT_ADD_ABILITY1:
DoCastSelf(SPELL_GREATER_PW_SHIELD);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 30s);
break;
case EVENT_ADD_ABILITY2:
if (Unit* target = DoSelectLowestHpFriendly(60.0f, 50000))
{
DoCast(target, SPELL_HEAL);
}
events.ScheduleEvent(EVENT_ADD_ABILITY2, 25s);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 6s);
break;
case EVENT_ADD_ABILITY2:
DoCastSelf(SPELL_GREATER_PW_SHIELD);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 30s);
break;
case EVENT_ADD_ABILITY3:
me->CastSpell(me, SPELL_PRAYER_OH, false);
@@ -417,9 +419,9 @@ struct boss_krosh_firehand : public ScriptedAI
me->SetInCombatWithZone();
instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 1s);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 5s);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 1500ms); //spellshield
events.ScheduleEvent(EVENT_ADD_ABILITY2, 3500ms); //greater fireball
events.ScheduleEvent(EVENT_ADD_ABILITY3, 8s); //blast wave (needs to check for players in range)
}
void JustDied(Unit* /*killer*/) override
@@ -439,16 +441,19 @@ struct boss_krosh_firehand : public ScriptedAI
switch (events.ExecuteEvent())
{
case EVENT_ADD_ABILITY1:
DoCastVictim(SPELL_GREATER_FIREBALL);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 3500ms);
DoCastSelf(SPELL_SPELLSHIELD);
events.ScheduleEvent(EVENT_ADD_ABILITY1, 30s);
break;
case EVENT_ADD_ABILITY2:
DoCastSelf(SPELL_SPELLSHIELD);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 40s);
DoCastVictim(SPELL_GREATER_FIREBALL);
events.ScheduleEvent(EVENT_ADD_ABILITY2, 1s);
break;
case EVENT_ADD_ABILITY3:
DoCastAOE(SPELL_BLAST_WAVE);
events.ScheduleEvent(EVENT_ADD_ABILITY3, 20s);
if (me->SelectNearestPlayer(15.0f))
{
DoCastAOE(SPELL_BLAST_WAVE);
}
events.ScheduleEvent(EVENT_ADD_ABILITY3, 8s);
break;
}