mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-22 21:26:23 +00:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user