Merge branch 'master' into Playerbot
This commit is contained in:
@@ -23,6 +23,7 @@ Category: commandscripts
|
||||
EndScriptData */
|
||||
|
||||
#include "AccountMgr.h"
|
||||
#include "AchievementMgr.h"
|
||||
#include "Chat.h"
|
||||
#include "CommandScript.h"
|
||||
#include "DBCStores.h"
|
||||
@@ -272,6 +273,8 @@ public:
|
||||
stmt->SetData(1, playerGuid.GetCounter());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(playerGuid.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL);
|
||||
|
||||
sCharacterCache->UpdateCharacterLevel(playerGuid, newLevel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
{
|
||||
{ "buyerror", HandleDebugSendBuyErrorCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "channelnotify", HandleDebugSendChannelNotifyCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "chatmmessage", HandleDebugSendChatMsgCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "chatmessage", HandleDebugSendChatMsgCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "equiperror", HandleDebugSendEquipErrorCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "largepacket", HandleDebugSendLargePacketCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
{ "opcode", HandleDebugSendOpcodeCommand, SEC_ADMINISTRATOR, Console::No },
|
||||
|
||||
@@ -157,9 +157,6 @@ public:
|
||||
|
||||
if (args.empty() || !tokens.size())
|
||||
{
|
||||
handler->PSendSysMessage("Usage: .skirmish [arena] [XvX] [Nick1] [Nick2] ... [NickN]");
|
||||
handler->PSendSysMessage("[arena] can be \"all\" or comma-separated list of possible arenas (NA, BE, RL, DS, RV).");
|
||||
handler->PSendSysMessage("[XvX] can be 1v1, 2v2, 3v3, 5v5. After [XvX] specify enough nicknames for that mode.");
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -42,7 +42,8 @@ enum DataTypes
|
||||
DATA_GATHIOS_THE_SHATTERER = 12,
|
||||
DATA_HIGH_NETHERMANCER_ZEREVOR = 13,
|
||||
DATA_LADY_MALANDE = 14,
|
||||
DATA_VERAS_DARKSHADOW = 15
|
||||
DATA_VERAS_DARKSHADOW = 15,
|
||||
DATA_BLACK_TEMPLE_TRIGGER = 16
|
||||
};
|
||||
|
||||
enum CreatureIds
|
||||
@@ -82,7 +83,8 @@ enum CreatureIds
|
||||
NPC_ASHTONGUE_STALKER = 23374,
|
||||
NPC_STORM_FURY = 22848,
|
||||
|
||||
NPC_DRAGON_TURTLE = 22885
|
||||
NPC_DRAGON_TURTLE = 22885,
|
||||
NPC_BLACK_TEMPLE_TRIGGER = 22984
|
||||
};
|
||||
|
||||
enum GameObjectIds
|
||||
@@ -113,6 +115,12 @@ enum MiscIds
|
||||
SPELL_SUMMON_SHADOWFIENDS = 41159
|
||||
};
|
||||
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_NAJENTUS_DEFEATED = 0,
|
||||
EMOTE_LOWER_TEMPLE_DEFEATED = 1
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
inline AI* GetBlackTempleAI(T* obj)
|
||||
{
|
||||
|
||||
@@ -1186,14 +1186,37 @@ struct npc_parasitic_shadowfiend : public ScriptedAI
|
||||
{
|
||||
npc_parasitic_shadowfiend(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
bool CanAIAttack(Unit const* who) const override
|
||||
{
|
||||
return !who->HasAura(SPELL_PARASITIC_SHADOWFIEND) && !who->HasAura(SPELL_PARASITIC_SHADOWFIEND_TRIGGER);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void IsSummonedBy(WorldObject* /*summoner*/) override
|
||||
{
|
||||
// Simulate blizz-like AI delay to avoid extreme overpopulation of adds
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
|
||||
scheduler.Schedule(2400ms, [this](TaskContext context)
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetInCombatWithZone();
|
||||
}, 2400ms);
|
||||
context.Repeat();
|
||||
});
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1298,12 +1321,21 @@ struct npc_flame_of_azzinoth : public ScriptedAI
|
||||
DoCastVictim(SPELL_FLAME_BLAST);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
if (Unit* target = me->GetVictim())
|
||||
target->CastSpell(target, SPELL_BLAZE, true);
|
||||
DoCastVictim(SPELL_BLAZE);
|
||||
}, 1s);
|
||||
}, 15s, 20s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
ObjectGuid _bladeGUID;
|
||||
};
|
||||
|
||||
@@ -147,11 +147,11 @@ struct boss_illidari_council : public BossAI
|
||||
|
||||
bool spoken = false;
|
||||
|
||||
me->CastSpell(me, SPELL_EMPYREAL_BALANCE, true);
|
||||
DoCastSelf(SPELL_EMPYREAL_BALANCE, true);
|
||||
|
||||
ScheduleTimedEvent(3200ms, [&]
|
||||
{
|
||||
me->CastSpell(me, SPELL_EMPYREAL_EQUIVALENCY, true);
|
||||
DoCastSelf(SPELL_EMPYREAL_EQUIVALENCY, true);
|
||||
}, 3200ms);
|
||||
|
||||
for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i)
|
||||
@@ -239,7 +239,7 @@ struct boss_illidari_council_memberAI : public ScriptedAI
|
||||
{
|
||||
if (param == ACTION_ENRAGE)
|
||||
{
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
DoCastSelf(SPELL_BERSERK, true);
|
||||
Talk(SAY_COUNCIL_ENRAGE);
|
||||
}
|
||||
}
|
||||
@@ -331,14 +331,14 @@ struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI
|
||||
events.ScheduleEvent(EVENT_SPELL_BLESSING, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_AURA:
|
||||
me->CastSpell(me, _toggleAura ? SPELL_DEVOTION_AURA : SPELL_CHROMATIC_RESISTANCE_AURA);
|
||||
DoCastSelf(_toggleAura ? SPELL_DEVOTION_AURA : SPELL_CHROMATIC_RESISTANCE_AURA);
|
||||
_toggleAura = !_toggleAura;
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 60s);
|
||||
break;
|
||||
case EVENT_SPELL_CONSECRATION:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
||||
DoCastSelf(SPELL_CONSECRATION);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER_OF_JUSTICE:
|
||||
@@ -352,12 +352,12 @@ struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0s);
|
||||
break;
|
||||
case EVENT_SPELL_SEAL:
|
||||
me->CastSpell(me, _toggleSeal ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD);
|
||||
DoCastSelf(_toggleSeal ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD);
|
||||
_toggleSeal = !_toggleSeal;
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAL, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_JUDGEMENT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false);
|
||||
me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT);
|
||||
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 16s, 20s);
|
||||
break;
|
||||
}
|
||||
@@ -511,22 +511,22 @@ struct boss_lady_malande : public boss_illidari_council_memberAI
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_CIRCLE_OF_HEALING:
|
||||
me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false);
|
||||
DoCastSelf(SPELL_CIRCLE_OF_HEALING);
|
||||
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_REFLECTIVE_SHIELD:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false);
|
||||
DoCastSelf(SPELL_REFLECTIVE_SHIELD);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40s);
|
||||
break;
|
||||
case EVENT_SPELL_DIVINE_WRATH:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_DIVINE_WRATH, false);
|
||||
me->CastSpell(target, SPELL_DIVINE_WRATH);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_EMPOWERED_SMITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false);
|
||||
me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE);
|
||||
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3s);
|
||||
break;
|
||||
}
|
||||
@@ -542,7 +542,7 @@ struct boss_veras_darkshadow : public boss_illidari_council_memberAI
|
||||
me->SetCanDualWield(true);
|
||||
boss_illidari_council_memberAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 10s);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 90s);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 15min);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -564,13 +564,13 @@ struct boss_veras_darkshadow : public boss_illidari_council_memberAI
|
||||
case EVENT_SPELL_VANISH:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_DEADLY_STRIKE, false);
|
||||
me->CastSpell(me, SPELL_VANISH, false);
|
||||
DoCastSelf(SPELL_DEADLY_STRIKE);
|
||||
DoCastSelf(SPELL_VANISH);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 60s);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29s);
|
||||
break;
|
||||
case EVENT_SPELL_VANISH_OUT:
|
||||
me->CastSpell(me, SPELL_VANISH_OUT, false);
|
||||
DoCastSelf(SPELL_VANISH_OUT);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
DoResetThreatList();
|
||||
|
||||
@@ -278,6 +278,7 @@ struct npc_akama_shade : public ScriptedAI
|
||||
}
|
||||
else if (damage >= me->GetHealth() && !_died)
|
||||
{
|
||||
_died = true;
|
||||
damage = me->GetHealth() - 1;
|
||||
Talk(SAY_DEATH);
|
||||
if (Creature* shade = instance->GetCreature(DATA_SHADE_OF_AKAMA))
|
||||
|
||||
@@ -62,6 +62,7 @@ ObjectData const creatureData[] =
|
||||
{ NPC_VERAS_DARKSHADOW, DATA_VERAS_DARKSHADOW },
|
||||
{ NPC_AKAMA_ILLIDAN, DATA_AKAMA_ILLIDAN },
|
||||
{ NPC_ILLIDAN_STORMRAGE, DATA_ILLIDAN_STORMRAGE },
|
||||
{ NPC_BLACK_TEMPLE_TRIGGER, DATA_BLACK_TEMPLE_TRIGGER },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
@@ -165,18 +166,31 @@ public:
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_SHADE_OF_AKAMA && state == DONE)
|
||||
if (state == DONE)
|
||||
{
|
||||
for (ObjectGuid const& guid : ashtongueGUIDs)
|
||||
if (Creature* ashtongue = instance->GetCreature(guid))
|
||||
ashtongue->SetFaction(FACTION_ASHTONGUE_DEATHSWORN);
|
||||
}
|
||||
else if (type == DATA_ILLIDARI_COUNCIL && state == DONE)
|
||||
{
|
||||
if (Creature* akama = GetCreature(DATA_AKAMA_ILLIDAN))
|
||||
akama->AI()->DoAction(0);
|
||||
}
|
||||
switch (type)
|
||||
{
|
||||
case DATA_HIGH_WARLORD_NAJENTUS:
|
||||
if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER))
|
||||
trigger->AI()->Talk(EMOTE_NAJENTUS_DEFEATED);
|
||||
break;
|
||||
case DATA_SHADE_OF_AKAMA:
|
||||
for (ObjectGuid const& guid : ashtongueGUIDs)
|
||||
if (Creature* ashtongue = instance->GetCreature(guid))
|
||||
ashtongue->SetFaction(FACTION_ASHTONGUE_DEATHSWORN);
|
||||
break;
|
||||
case DATA_ILLIDARI_COUNCIL:
|
||||
if (Creature* akama = GetCreature(DATA_AKAMA_ILLIDAN))
|
||||
akama->AI()->DoAction(0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (AllBossesDone({ DATA_SHADE_OF_AKAMA, DATA_TERON_GOREFIEND, DATA_GURTOGG_BLOODBOIL, DATA_RELIQUARY_OF_SOULS }))
|
||||
if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER))
|
||||
trigger->AI()->Talk(EMOTE_LOWER_TEMPLE_DEFEATED);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user