fix(Core/Events): Apothecary Hummel (#10615)

* Fix(Core/Events): Apothecary Hummel

Co-authored-by: sirikfoll <sirikfoll@hotmail.com>
Co-authored-by: Killyana <Killyana@users.noreply.github.com>

* missed return

* Missing include

* Fixed delete

Co-authored-by: sirikfoll <sirikfoll@hotmail.com>
Co-authored-by: Killyana <Killyana@users.noreply.github.com>
This commit is contained in:
Nefertumm
2022-02-11 06:00:10 -03:00
committed by GitHub
parent 5d8b472ed7
commit c9ac48e824
7 changed files with 862 additions and 316 deletions

View File

@@ -255,289 +255,25 @@ struct npc_love_in_air_snivel_real : public ScriptedAI
}
};
///////////////////////////////////////
////// BOSS
///////////////////////////////////////
enum hummel
{
QUEST_YOUVE_BEEN_SERVED = 14488,
NPC_APOTHECARY_HUMMEL = 36296,
NPC_APOTHECARY_FRYE = 36272,
NPC_APOTHECARY_BAXTER = 36565,
SPELL_COLOGNE_IMMUNE = 68530,
SPELL_COLOGNE_PASSIVE_DAMAGE = 68947,
SPELL_PERFUME_PASSIVE_DAMAGE = 68641,
SPELL_THROW_COLOGNE = 68614,
SPELL_THROW_PERFUME = 68798,
// Real fight
SPELL_COLOGNE_SPRAY = 68948,
SPELL_ALLURING_PERFUME_SPRAY = 68607,
SPELL_CHAIN_REACTION = 68821,
ACTION_START_EVENT = 1,
ACTION_RELEASE_HELPER = 2,
EVENT_CALL_BAXTER = 1,
EVENT_CALL_FRYE = 2,
EVENT_SPELL_PERFUME_SPRAY = 3,
EVENT_SPELL_CHAIN_REACTION = 4,
EVENT_SPELL_THROW = 5,
};
enum HummelSay
{
SAY_HUMMEL_0 = 0,
SAY_HUMMEL_1 = 1,
SAY_HUMMEL_2 = 2,
SAY_HUMMEL_5 = 5
};
class npc_love_in_air_hummel : public CreatureScript
{
public:
npc_love_in_air_hummel() : CreatureScript("npc_love_in_air_hummel") { }
struct npc_love_in_air_hummelAI : public ScriptedAI
{
npc_love_in_air_hummelAI(Creature* creature) : ScriptedAI(creature), summons(me) { speachTimer = 0; }
SummonList summons;
EventMap events;
uint32 speachTimer;
bool CanBeSeen(Player const* player) override
{
if (player->IsGameMaster())
{
return true;
}
Group const* group = player->GetGroup();
return group && sLFGMgr->GetDungeon(group->GetGUID()) == lfg::LFG_DUNGEON_CROWN_CHEMICAL_CO;
}
void Reset() override
{
speachTimer = 0;
me->SetFaction(FACTION_FRIENDLY);
summons.DespawnAll();
events.Reset();
me->SummonCreature(NPC_APOTHECARY_FRYE, -205.449f, 2219.56f, 79.7633f, 0.7f);
me->SummonCreature(NPC_APOTHECARY_BAXTER, -209.602f, 2215.42f, 79.7633f, 0.723503f);
}
void DoAction(int32 param) override
{
if (param == ACTION_START_EVENT)
speachTimer = 1;
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_HUMMEL_5);
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (!players.IsEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup())
sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), lfg::LFG_DUNGEON_CROWN_CHEMICAL_CO, me->FindMap());
}
void JustSummoned(Creature* cr) override
{
summons.Summon(cr);
cr->SetFaction(FACTION_FRIENDLY);
cr->SetControlled(true, UNIT_STATE_STUNNED);
cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void UpdateAI(uint32 diff) override
{
if (speachTimer)
{
speachTimer += diff;
if (speachTimer < 10000)
{
Talk(SAY_HUMMEL_0);
speachTimer = 10000;
}
else if (speachTimer >= 16000 && speachTimer < 20000)
{
Talk(SAY_HUMMEL_1);
speachTimer = 20000;
}
else if (speachTimer >= 26000 && speachTimer < 30000)
{
Talk(SAY_HUMMEL_2);
speachTimer = 0;
me->SetFaction(FACTION_MONSTER_2);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
{
AttackStart(target);
events.ScheduleEvent(EVENT_CALL_BAXTER, 10000);
events.ScheduleEvent(EVENT_CALL_FRYE, 20000);
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
EnterEvadeMode();
}
return;
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_CALL_BAXTER:
{
EntryCheckPredicate pred(NPC_APOTHECARY_BAXTER);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
break;
}
case EVENT_CALL_FRYE:
{
EntryCheckPredicate pred(NPC_APOTHECARY_FRYE);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
break;
}
case EVENT_SPELL_PERFUME_SPRAY:
DoCastVictim(SPELL_ALLURING_PERFUME_SPRAY);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
DoCastVictim(SPELL_CHAIN_REACTION);
events.RepeatEvent(12000);
break;
}
DoMeleeAttackIfReady();
}
};
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
{
creature->AI()->DoAction(ACTION_START_EVENT);
CloseGossipMenuFor(player);
return true;
}
bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest* _Quest, uint32 /*slot*/) override
{
if (_Quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
{
creature->AI()->DoAction(ACTION_START_EVENT);
}
return true;
}
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_love_in_air_hummelAI(creature);
};
};
enum HummelHelperSay
{
SAY_HUMMEL_HELPER_SAY_5 = 5,
};
struct npc_love_in_air_hummel_helper : public ScriptedAI
{
npc_love_in_air_hummel_helper(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
bool CanBeSeen(Player const* player) override
{
if (player->IsGameMaster())
{
return true;
}
Group const* group = player->GetGroup();
return group && sLFGMgr->GetDungeon(group->GetGUID()) == lfg::LFG_DUNGEON_CROWN_CHEMICAL_CO;
}
void Reset() override
{
}
void DoAction(int32 param) override
{
if (param == ACTION_RELEASE_HELPER)
{
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetFaction(FACTION_MONSTER_2);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
AttackStart(target);
if (me->GetEntry() == NPC_APOTHECARY_BAXTER)
{
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
events.ScheduleEvent(EVENT_SPELL_THROW, 5000);
}
}
void JustDied(Unit* /*killer*/) override
{
me->AI()->Talk(SAY_HUMMEL_HELPER_SAY_5);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_PERFUME_SPRAY:
DoCastVictim(SPELL_COLOGNE_SPRAY);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
DoCastVictim(SPELL_CHAIN_REACTION);
events.RepeatEvent(12000);
break;
case EVENT_SPELL_THROW:
if (Unit* target = SelectTarget(SelectTargetMethod::Random))
{
Position pos(*me);
me->Relocate(target);
me->CastSpell(me, RAND(SPELL_THROW_COLOGNE, SPELL_THROW_PERFUME), true, nullptr, nullptr, me->GetGUID());
me->Relocate(pos);
}
events.RepeatEvent(10000);
break;
}
DoMeleeAttackIfReady();
}
};
///////////////////////////////////////
////// SPELLS
///////////////////////////////////////
enum SpellsCologneImmune
{
SPELL_COLOGNE_IMMUNE = 68530,
SPELL_COLOGNE_PASSIVE_DAMAGE = 68947,
SPELL_PERFUME_PASSIVE_DAMAGE = 68641,
SPELL_THROW_COLOGNE = 68614,
SPELL_THROW_PERFUME = 68798,
// Real fight
SPELL_COLOGNE_SPRAY = 68948,
SPELL_ALLURING_PERFUME_SPRAY = 68607,
SPELL_CHAIN_REACTION = 68821
};
class spell_love_in_air_perfume_immune : public AuraScript
{
PrepareAuraScript(spell_love_in_air_perfume_immune);
@@ -583,29 +319,6 @@ class spell_love_in_air_perfume_immune : public AuraScript
}
};
class spell_love_in_air_periodic_perfumes : public AuraScript
{
PrepareAuraScript(spell_love_in_air_periodic_perfumes);
void PeriodicTick(AuraEffect const* /*aurEff*/)
{
ObjectGuid guid = GetCaster() ? GetCaster()->GetGUID() : ObjectGuid::Empty;
if (Unit* target = GetTarget())
{
uint32 spellId = (GetId() == SPELL_THROW_COLOGNE ? 68934 : 68927);
if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(spellId)))
return;
target->CastSpell(target, spellId, true, nullptr, nullptr, guid);
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_in_air_periodic_perfumes::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
enum CreateHeartCandy
{
SPELL_CREATE_HEART_CANDY_1 = 26668,
@@ -773,13 +486,8 @@ void AddSC_event_love_in_the_air()
RegisterCreatureAI(npc_love_in_air_snivel);
RegisterCreatureAI(npc_love_in_air_snivel_real);
// Boss
new npc_love_in_air_hummel();
RegisterCreatureAI(npc_love_in_air_hummel_helper);
// Spells
RegisterSpellScript(spell_love_in_air_perfume_immune);
RegisterSpellScript(spell_love_in_air_periodic_perfumes);
RegisterSpellScript(spell_item_create_heart_candy);
RegisterSpellScript(spell_love_is_in_the_air_romantic_picnic);
RegisterSpellScript(spell_gen_aura_service_uniform);