mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-03-17 06:25:11 +00:00
fix(Core/Event): improve "Let the fires come" event (#8199)
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1633773844859273100');
|
||||||
|
|
||||||
|
UPDATE `creature_template` SET `faction`=1998, `InhabitType`=3 WHERE `entry`=23543;
|
||||||
|
UPDATE `creature_template_addon` SET `Mount`=0 WHERE `entry`=23543;
|
||||||
|
|
||||||
|
DELETE FROM `creature_text` WHERE `CreatureID`=23543;
|
||||||
|
INSERT INTO `creature_text` VALUES
|
||||||
|
(23543,0,0,'Harken, cur! Tis you I spurn! Now feel... the burn!',12,0,100,0,0,0,22587,0,'Shade of Horseman Talk 0'),
|
||||||
|
(23543,1,0,'Prepare yourselves, the bells have tolled! Shelter your weak, your young and your old! Each of you shall pay the final sum! Cry for mercy; the reckoning has come!',14,0,100,0,0,11966,22022,0,'Shade of Horseman Talk 1'),
|
||||||
|
(23543,2,0,'The sky is dark. The fire burns. You strive in vain as Fate\'s wheel turns.',14,0,100,0,0,12570,22034,0,'Shade of Horseman Talk 2'),
|
||||||
|
(23543,3,0,'The town still burns. A cleansing fire! Time is short, I\'ll soon retire!',14,0,100,0,0,12571,22035,0,'Shade of Horseman Talk 3'),
|
||||||
|
(23543,4,0,'Fire consumes! You\'ve tried and failed. Let there be no doubt, justice prevailed!',14,0,100,0,0,11967,22026,0,'Shade of Horseman Talk 4'),
|
||||||
|
(23543,5,0,'My flames have died, left not a spark! I shall send you now to the lifeless dark!',14,0,100,0,0,11968,22027,0,'Shade of Horseman Talk 5'),
|
||||||
|
(23543,6,0,'So eager you are, for my blood to spill. Yet to vanquish me, \'tis my head you must kill!',14,0,100,0,0,11969,22757,0,'Shade of Horseman Talk 6');
|
||||||
@@ -3491,6 +3491,12 @@ void SpellMgr::LoadDbcDataCorrections()
|
|||||||
spellInfo->RangeIndex = 6; // 100 yards
|
spellInfo->RangeIndex = 6; // 100 yards
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Headless Horseman - Start Fire
|
||||||
|
ApplySpellFix({ 42132 }, [](SpellEntry* spellInfo)
|
||||||
|
{
|
||||||
|
spellInfo->RangeIndex = 6; // 100 yards
|
||||||
|
});
|
||||||
|
|
||||||
//They Must Burn Bomb Aura (self)
|
//They Must Burn Bomb Aura (self)
|
||||||
ApplySpellFix({ 36350 }, [](SpellEntry* spellInfo)
|
ApplySpellFix({ 36350 }, [](SpellEntry* spellInfo)
|
||||||
{
|
{
|
||||||
@@ -7386,6 +7392,12 @@ void SpellMgr::LoadDbcDataCorrections()
|
|||||||
spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
|
spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Conflagration, Horseman's Cleave
|
||||||
|
ApplySpellFix({ 42380, 42587 }, [](SpellEntry* spellInfo)
|
||||||
|
{
|
||||||
|
spellInfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;
|
||||||
|
});
|
||||||
|
|
||||||
for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i)
|
for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i)
|
||||||
{
|
{
|
||||||
SpellEntry* spellInfo = (SpellEntry*)sSpellStore.LookupEntry(i);
|
SpellEntry* spellInfo = (SpellEntry*)sSpellStore.LookupEntry(i);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "ScriptMgr.h"
|
#include "ScriptMgr.h"
|
||||||
#include "SpellAuraEffects.h"
|
#include "SpellAuraEffects.h"
|
||||||
#include "SpellScript.h"
|
#include "SpellScript.h"
|
||||||
|
#include "TaskScheduler.h"
|
||||||
|
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
////// ITEMS FIXES, BASIC STUFF
|
////// ITEMS FIXES, BASIC STUFF
|
||||||
@@ -274,6 +275,9 @@ enum costumedOrphan
|
|||||||
SPELL_CREATE_BUCKET = 42349,
|
SPELL_CREATE_BUCKET = 42349,
|
||||||
SPELL_WATER_SPLASH = 42348,
|
SPELL_WATER_SPLASH = 42348,
|
||||||
SPELL_SUMMON_LANTERN = 44255,
|
SPELL_SUMMON_LANTERN = 44255,
|
||||||
|
SPELL_HORSEMAN_CONFLAGRATION = 42380,
|
||||||
|
SPELL_HORSEMAN_CONFLAGRATION_SOUND = 48149,
|
||||||
|
SPELL_HORSEMAN_CLEAVE = 42587,
|
||||||
|
|
||||||
// NPCs
|
// NPCs
|
||||||
NPC_SHADE_OF_HORSEMAN = 23543,
|
NPC_SHADE_OF_HORSEMAN = 23543,
|
||||||
@@ -284,6 +288,15 @@ enum costumedOrphan
|
|||||||
ACTION_START_EVENT = 1,
|
ACTION_START_EVENT = 1,
|
||||||
DATA_EVENT = 1,
|
DATA_EVENT = 1,
|
||||||
DATA_ALLOW_START = 2,
|
DATA_ALLOW_START = 2,
|
||||||
|
|
||||||
|
// Talks
|
||||||
|
TALK_SHADE_CONFLAGRATION = 0,
|
||||||
|
TALK_SHADE_PREPARE = 1,
|
||||||
|
TALK_SHADE_START_EVENT = 2,
|
||||||
|
TALK_SHADE_MORE_FIRES = 3,
|
||||||
|
TALK_SHADE_FAILED = 4,
|
||||||
|
TALK_SHADE_DEFEATED = 5,
|
||||||
|
TALK_SHADE_DEATH = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
class spell_hallows_end_bucket_lands : public SpellScriptLoader
|
class spell_hallows_end_bucket_lands : public SpellScriptLoader
|
||||||
@@ -330,6 +343,17 @@ public:
|
|||||||
{
|
{
|
||||||
PrepareAuraScript(spell_hallows_end_base_fire_AuraScript);
|
PrepareAuraScript(spell_hallows_end_base_fire_AuraScript);
|
||||||
|
|
||||||
|
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& /*isPeriodic*/, int32& amplitude)
|
||||||
|
{
|
||||||
|
if (Creature* creature = GetCaster()->ToCreature())
|
||||||
|
{
|
||||||
|
if (!(creature->AI()->GetData(0) % 3))
|
||||||
|
{
|
||||||
|
amplitude = static_cast<int32>(amplitude * 1.5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
|
void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
|
||||||
{
|
{
|
||||||
// can start from 0
|
// can start from 0
|
||||||
@@ -353,13 +377,14 @@ public:
|
|||||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||||
{
|
{
|
||||||
Unit* target = GetTarget();
|
Unit* target = GetTarget();
|
||||||
target->SetObjectScale(0.5f);
|
target->SetObjectScale(1.0f);
|
||||||
if (AuraEffect* aEff = GetEffect(EFFECT_0))
|
if (AuraEffect* aEff = GetEffect(EFFECT_0))
|
||||||
aEff->SetAmount(1);
|
aEff->SetAmount(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Register() override
|
void Register() override
|
||||||
{
|
{
|
||||||
|
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_hallows_end_base_fire_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||||
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hallows_end_base_fire_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hallows_end_base_fire_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||||
OnEffectApply += AuraEffectApplyFn(spell_hallows_end_base_fire_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
OnEffectApply += AuraEffectApplyFn(spell_hallows_end_base_fire_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||||
}
|
}
|
||||||
@@ -453,7 +478,7 @@ public:
|
|||||||
GetInitXYZ(x, y, z, o, path);
|
GetInitXYZ(x, y, z, o, path);
|
||||||
if (Creature* cr = me->SummonCreature(NPC_SHADE_OF_HORSEMAN, x, y, z, o, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000))
|
if (Creature* cr = me->SummonCreature(NPC_SHADE_OF_HORSEMAN, x, y, z, o, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000))
|
||||||
{
|
{
|
||||||
cr->GetMotionMaster()->MovePath(path, false);
|
cr->GetMotionMaster()->MovePath(path, true);
|
||||||
cr->AI()->DoAction(path);
|
cr->AI()->DoAction(path);
|
||||||
horseGUID = cr->GetGUID();
|
horseGUID = cr->GetGUID();
|
||||||
}
|
}
|
||||||
@@ -473,7 +498,7 @@ public:
|
|||||||
if (eventStarted)
|
if (eventStarted)
|
||||||
{
|
{
|
||||||
eventStarted += diff;
|
eventStarted += diff;
|
||||||
if (eventStarted >= 5 * MINUTE * IN_MILLISECONDS)
|
if (eventStarted >= 400 * IN_MILLISECONDS)
|
||||||
{
|
{
|
||||||
allowQuest = false;
|
allowQuest = false;
|
||||||
eventStarted = 0;
|
eventStarted = 0;
|
||||||
@@ -564,20 +589,43 @@ public:
|
|||||||
me->SetDisableGravity(true);
|
me->SetDisableGravity(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) override
|
void SpellHit(Unit* caster, const SpellInfo* spellInfo) override
|
||||||
{
|
{
|
||||||
if (spellInfo->Id == SPELL_START_FIRE)
|
if (spellInfo->Id == SPELL_START_FIRE)
|
||||||
{
|
{
|
||||||
me->CastSpell(me, SPELL_FIRE_AURA_BASE, true);
|
me->CastSpell(me, SPELL_FIRE_AURA_BASE, true);
|
||||||
if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0))
|
if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0))
|
||||||
{
|
{
|
||||||
me->SetObjectScale(1.5f);
|
int32 amount = 1;
|
||||||
aurEff->SetAmount(2);
|
if (Creature* creature = caster->ToCreature())
|
||||||
|
{
|
||||||
|
if ((creature->AI()->GetData(0) % 3) > 0)
|
||||||
|
{
|
||||||
|
amount = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
me->SetObjectScale(0.5f + 0.5f * amount);
|
||||||
|
aurEff->SetAmount(amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (spellInfo->Id == SPELL_SPREAD_FIRE)
|
else if (spellInfo->Id == SPELL_SPREAD_FIRE)
|
||||||
{
|
{
|
||||||
me->CastSpell(me, SPELL_FIRE_AURA_BASE, true);
|
me->CastSpell(me, SPELL_FIRE_AURA_BASE, true);
|
||||||
|
if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0))
|
||||||
|
{
|
||||||
|
int32 amount = 0;
|
||||||
|
if (Creature* creature = caster->ToCreature())
|
||||||
|
{
|
||||||
|
if ((creature->AI()->GetData(0) % 3) > 1)
|
||||||
|
{
|
||||||
|
amount = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
me->SetObjectScale(0.5f + 0.5f * amount);
|
||||||
|
aurEff->SetAmount(amount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (spellInfo->Id == SPELL_WATER_SPLASH)
|
else if (spellInfo->Id == SPELL_WATER_SPLASH)
|
||||||
{
|
{
|
||||||
@@ -616,15 +664,36 @@ public:
|
|||||||
unitList.clear();
|
unitList.clear();
|
||||||
me->CastSpell(me, SPELL_HORSEMAN_MOUNT, true);
|
me->CastSpell(me, SPELL_HORSEMAN_MOUNT, true);
|
||||||
me->SetSpeed(MOVE_WALK, 3.0f, true);
|
me->SetSpeed(MOVE_WALK, 3.0f, true);
|
||||||
Unmount = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unmount;
|
|
||||||
EventMap events;
|
EventMap events;
|
||||||
|
uint32 playerCount;
|
||||||
uint32 counter;
|
uint32 counter;
|
||||||
GuidList unitList;
|
GuidList unitList;
|
||||||
int32 pos;
|
int32 pos;
|
||||||
void EnterCombat(Unit*) override {}
|
TaskScheduler scheduler;
|
||||||
|
|
||||||
|
void EnterCombat(Unit*) override
|
||||||
|
{
|
||||||
|
scheduler.Schedule(6s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.f, true))
|
||||||
|
{
|
||||||
|
me->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION, false);
|
||||||
|
target->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION_SOUND, true);
|
||||||
|
Talk(TALK_SHADE_CONFLAGRATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Repeat(12s);
|
||||||
|
})
|
||||||
|
.Schedule(7s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastVictim(SPELL_HORSEMAN_CLEAVE, true);
|
||||||
|
|
||||||
|
context.Repeat(8s);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void MoveInLineOfSight(Unit* /*who*/) override {}
|
void MoveInLineOfSight(Unit* /*who*/) override {}
|
||||||
|
|
||||||
void DoAction(int32 param) override
|
void DoAction(int32 param) override
|
||||||
@@ -676,17 +745,35 @@ public:
|
|||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
|
playerCount = 0;
|
||||||
unitList.clear();
|
unitList.clear();
|
||||||
std::list<Creature*> temp;
|
std::list<Creature*> temp;
|
||||||
me->GetCreaturesWithEntryInRange(temp, 100.0f, NPC_FIRE_TRIGGER);
|
me->GetCreaturesWithEntryInRange(temp, 100.0f, NPC_FIRE_TRIGGER);
|
||||||
for (std::list<Creature*>::const_iterator itr = temp.begin(); itr != temp.end(); ++itr)
|
for (std::list<Creature*>::const_iterator itr = temp.begin(); itr != temp.end(); ++itr)
|
||||||
|
{
|
||||||
unitList.push_back((*itr)->GetGUID());
|
unitList.push_back((*itr)->GetGUID());
|
||||||
|
}
|
||||||
|
|
||||||
events.ScheduleEvent(1, 3000);
|
events.ScheduleEvent(1, 3000);
|
||||||
events.ScheduleEvent(2, 5000);
|
events.ScheduleEvent(2, 25000);
|
||||||
events.ScheduleEvent(2, 7000);
|
events.ScheduleEvent(2, 43000);
|
||||||
events.ScheduleEvent(2, 10000);
|
events.ScheduleEvent(3, 63000);
|
||||||
events.ScheduleEvent(3, 15000);
|
|
||||||
|
me->SetReactState(REACT_PASSIVE);
|
||||||
|
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
|
||||||
|
me->SetCanFly(true);
|
||||||
|
me->SetDisableGravity(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnterEvadeMode() override
|
||||||
|
{
|
||||||
|
me->DespawnOrUnsummon(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GetData(uint32 /*type*/) const override
|
||||||
|
{
|
||||||
|
return playerCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
@@ -698,96 +785,136 @@ public:
|
|||||||
switch (events.ExecuteEvent())
|
switch (events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
me->Yell("Prepare yourselves, the bells have tolled! Shelter your weak, your young and your old! Each of you shall pay the final sum! Cry for mercy; the reckoning has come!", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_PREPARE);
|
||||||
me->PlayDirectSound(11966);
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
if (Unit* trigger = getTrigger())
|
CastFires(true);
|
||||||
me->CastSpell(trigger, SPELL_START_FIRE, true);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
counter++;
|
bool checkBurningTriggers = false;
|
||||||
if (counter > 10)
|
for (ObjectGuid const& guid : unitList)
|
||||||
{
|
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
||||||
if (counter > 12)
|
if (c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY))
|
||||||
{
|
{
|
||||||
bool failed = false;
|
checkBurningTriggers = true;
|
||||||
for (ObjectGuid const& guid : unitList)
|
break;
|
||||||
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
}
|
||||||
if (c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY))
|
|
||||||
{
|
|
||||||
failed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FinishEvent(failed);
|
if (!checkBurningTriggers)
|
||||||
}
|
{
|
||||||
|
FinishEvent(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
if (counter > 21)
|
||||||
|
{
|
||||||
|
bool failed = false;
|
||||||
|
for (ObjectGuid const& guid : unitList)
|
||||||
|
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
||||||
|
if (c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY))
|
||||||
|
{
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FinishEvent(failed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (counter == 5)
|
if (counter == 5)
|
||||||
{
|
{
|
||||||
me->Yell("The sky is dark. The fire burns. You strive in vain as Fate's wheel turns.", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_START_EVENT);
|
||||||
me->PlayDirectSound(12570);
|
|
||||||
}
|
}
|
||||||
else if (counter == 10)
|
else if (counter == 15)
|
||||||
{
|
{
|
||||||
me->Yell("The town still burns. A cleansing fire! Time is short, I'll soon retire!", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_MORE_FIRES);
|
||||||
me->PlayDirectSound(12571);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Unit* trigger = getTrigger())
|
CastFires(false);
|
||||||
me->CastSpell(trigger, SPELL_START_FIRE, true);
|
events.RepeatEvent(15000);
|
||||||
events.RepeatEvent(12000);
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
me->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
|
||||||
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
|
if (Unit* target = me->SelectNearestPlayer(30.0f))
|
||||||
|
AttackStart(target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Unmount)
|
|
||||||
{
|
|
||||||
me->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
|
|
||||||
me->RemoveAllAuras();
|
|
||||||
me->Dismount();
|
|
||||||
if (Unit* target = me->SelectNearestPlayer(30.0f))
|
|
||||||
AttackStart(target);
|
|
||||||
}
|
|
||||||
if (me->IsMounted())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// cleave
|
scheduler.Update(diff, [this]
|
||||||
if (!urand(0, 29))
|
{
|
||||||
me->CastSpell(me->GetVictim(), 15496, false);
|
DoMeleeAttackIfReady();
|
||||||
|
});
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit* getTrigger()
|
void CastFires(bool intial)
|
||||||
{
|
{
|
||||||
std::list<Unit*> tmpList;
|
std::vector<Unit*> tmpList;
|
||||||
for (ObjectGuid const& guid : unitList)
|
for (ObjectGuid const& guid : unitList)
|
||||||
|
{
|
||||||
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
||||||
|
{
|
||||||
if (!c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY))
|
if (!c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY))
|
||||||
|
{
|
||||||
tmpList.push_back(c);
|
tmpList.push_back(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (tmpList.empty())
|
if (tmpList.empty())
|
||||||
return nullptr;
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::list<Unit*>::const_iterator it2 = tmpList.begin();
|
std::list<Player*> players;
|
||||||
std::advance(it2, urand(0, tmpList.size() - 1));
|
Acore::AnyPlayerInObjectRangeCheck checker(me, 60.f);
|
||||||
return (*it2);
|
Acore::PlayerListSearcher<Acore::AnyPlayerInObjectRangeCheck> searcher(me, players, checker);
|
||||||
|
Cell::VisitWorldObjects(me, searcher, 60.f);
|
||||||
|
if (players.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerCount = static_cast<uint32>(players.size()) - 1;
|
||||||
|
|
||||||
|
if (!intial)
|
||||||
|
{
|
||||||
|
float playerRate = std::max(0.f, 0.5f - playerCount * 0.25f);
|
||||||
|
|
||||||
|
// If there are more burning triggers than players, do not cast next fire
|
||||||
|
if (tmpList.size() < unitList.size() * playerRate)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
playerCount += 1;
|
||||||
|
|
||||||
|
uint32 sizeCount = (playerCount / 3) + 1;
|
||||||
|
if (intial && playerCount > 0)
|
||||||
|
{
|
||||||
|
sizeCount += playerCount % 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Acore::Containers::RandomResize(tmpList, sizeCount);
|
||||||
|
for (Unit* trigger : tmpList)
|
||||||
|
me->CastSpell(trigger, SPELL_START_FIRE, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishEvent(bool failed)
|
void FinishEvent(bool failed)
|
||||||
{
|
{
|
||||||
if (failed)
|
if (failed)
|
||||||
{
|
{
|
||||||
me->Yell("Fire consumes! You've tried and failed. Let there be no doubt, justice prevailed!", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_FAILED);
|
||||||
me->PlayDirectSound(11967);
|
|
||||||
for (ObjectGuid const& guid : unitList)
|
for (ObjectGuid const& guid : unitList)
|
||||||
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
if (Unit* c = ObjectAccessor::GetUnit(*me, guid))
|
||||||
c->RemoveAllAuras();
|
c->RemoveAllAuras();
|
||||||
@@ -796,10 +923,11 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
me->Yell("My flames have died, left not a spark! I shall send you now to the lifeless dark!", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_DEFEATED);
|
||||||
me->PlayDirectSound(11968);
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
GetPosToLand(x, y, z);
|
GetPosToLand(x, y, z);
|
||||||
|
me->GetMotionMaster()->Clear();
|
||||||
|
me->GetMotionMaster()->MoveIdle();
|
||||||
me->GetMotionMaster()->MovePoint(8, x, y, z);
|
me->GetMotionMaster()->MovePoint(8, x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -808,14 +936,16 @@ public:
|
|||||||
{
|
{
|
||||||
if (type == POINT_MOTION_TYPE && point == 8)
|
if (type == POINT_MOTION_TYPE && point == 8)
|
||||||
{
|
{
|
||||||
Unmount = true;
|
me->RemoveAllAuras();
|
||||||
|
me->SetCanFly(false);
|
||||||
|
me->SetDisableGravity(false);
|
||||||
|
events.ScheduleEvent(4, 2000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
me->Yell("So eager you are, for my blood to spill. Yet to vanquish me, 'tis my head you must kill!", LANG_UNIVERSAL);
|
Talk(TALK_SHADE_DEATH);
|
||||||
me->PlayDirectSound(11969);
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
GetPosToLand(x, y, z);
|
GetPosToLand(x, y, z);
|
||||||
me->CastSpell(x, y, z, SPELL_SUMMON_LANTERN, true);
|
me->CastSpell(x, y, z, SPELL_SUMMON_LANTERN, true);
|
||||||
@@ -830,12 +960,12 @@ public:
|
|||||||
Acore::PlayerListSearcher<Acore::AnyPlayerInObjectRangeCheck> searcher(me, players, checker);
|
Acore::PlayerListSearcher<Acore::AnyPlayerInObjectRangeCheck> searcher(me, players, checker);
|
||||||
Cell::VisitWorldObjects(me, searcher, radius);
|
Cell::VisitWorldObjects(me, searcher, radius);
|
||||||
|
|
||||||
for (std::list<Player*>::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
for (Player* player : players)
|
||||||
{
|
{
|
||||||
(*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_H);
|
player->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_H);
|
||||||
(*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_A);
|
player->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_A);
|
||||||
(*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_H);
|
player->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_H);
|
||||||
(*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_A);
|
player->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_A);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -914,7 +1044,6 @@ enum headlessHorseman
|
|||||||
SPELL_SUMMONING_RHYME_TARGET = 42878,
|
SPELL_SUMMONING_RHYME_TARGET = 42878,
|
||||||
SPELL_HEAD_VISUAL = 42413,
|
SPELL_HEAD_VISUAL = 42413,
|
||||||
SPELL_EARTH_EXPLOSION = 42427,
|
SPELL_EARTH_EXPLOSION = 42427,
|
||||||
SPELL_HORSEMAN_CLEAVE = 42587,
|
|
||||||
SPELL_HORSEMAN_BODY_REGEN = 42403,
|
SPELL_HORSEMAN_BODY_REGEN = 42403,
|
||||||
SPELL_HORSEMAN_BODY_REGEN_CONFUSE = 43105,
|
SPELL_HORSEMAN_BODY_REGEN_CONFUSE = 43105,
|
||||||
SPELL_HORSEMAN_IMMUNITY = 42556,
|
SPELL_HORSEMAN_IMMUNITY = 42556,
|
||||||
@@ -926,7 +1055,6 @@ enum headlessHorseman
|
|||||||
SPELL_HORSEMAN_BODY_PHASE = 42547,
|
SPELL_HORSEMAN_BODY_PHASE = 42547,
|
||||||
SPELL_HORSEMAN_SPEAKS = 43129,
|
SPELL_HORSEMAN_SPEAKS = 43129,
|
||||||
SPELL_HORSEMAN_WHIRLWIND = 43116,
|
SPELL_HORSEMAN_WHIRLWIND = 43116,
|
||||||
SPELL_HORSEMAN_CONFLAGRATION = 42380,
|
|
||||||
SPELL_SUMMON_PUMPKIN = 42552,
|
SPELL_SUMMON_PUMPKIN = 42552,
|
||||||
SPELL_PUMPKIN_VISUAL = 42280,
|
SPELL_PUMPKIN_VISUAL = 42280,
|
||||||
SPELL_SQUASH_SOUL = 42514,
|
SPELL_SQUASH_SOUL = 42514,
|
||||||
@@ -1191,7 +1319,11 @@ public:
|
|||||||
case EVENT_HORSEMAN_CONFLAGRATION:
|
case EVENT_HORSEMAN_CONFLAGRATION:
|
||||||
{
|
{
|
||||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||||
|
{
|
||||||
me->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION, false);
|
me->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION, false);
|
||||||
|
target->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION_SOUND, true);
|
||||||
|
me->Say("Harken, cur! Tis you I spurn! Now feel... the burn!", LANG_UNIVERSAL, target);
|
||||||
|
}
|
||||||
|
|
||||||
events.RepeatEvent(12500);
|
events.RepeatEvent(12500);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user