/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "ScriptMgr.h"
#include "Containers.h"
#include "CreatureAIImpl.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
enum HallowEndCandysSpells
{
SPELL_HALLOWS_END_CANDY_ORANGE_GIANT = 24924, // Effect 1: Apply Aura: Mod Size, Value: 30%
SPELL_HALLOWS_END_CANDY_SKELETON = 24925, // Effect 1: Apply Aura: Change Model (Skeleton). Effect 2: Apply Aura: Underwater Breathing
SPELL_HALLOWS_END_CANDY_PIRATE = 24926, // Effect 1: Apply Aura: Increase Swim Speed, Value: 50%
SPELL_HALLOWS_END_CANDY_GHOST = 24927, // Effect 1: Apply Aura: Levitate / Hover. Effect 2: Apply Aura: Slow Fall, Effect 3: Apply Aura: Water Walking
SPELL_HALLOWS_END_CANDY_FEMALE_DEFIAS_PIRATE = 44742, // Effect 1: Apply Aura: Change Model (Defias Pirate, Female). Effect 2: Increase Swim Speed, Value: 50%
SPELL_HALLOWS_END_CANDY_MALE_DEFIAS_PIRATE = 44743 // Effect 1: Apply Aura: Change Model (Defias Pirate, Male). Effect 2: Increase Swim Speed, Value: 50%
};
std::array const CandysSpells =
{
SPELL_HALLOWS_END_CANDY_ORANGE_GIANT,
SPELL_HALLOWS_END_CANDY_SKELETON,
SPELL_HALLOWS_END_CANDY_PIRATE,
SPELL_HALLOWS_END_CANDY_GHOST
};
enum HallowsEndChildrensCustomeSpells
{
SPELL_HALLOWS_END_SCARY_TIKI_MASK = 97095,
SPELL_HALLOWS_END_SCARY_WITCH_HAT = 97134,
SPELL_HALLOWS_END_SCARY_PUMPKIN_MASK = 97144,
SPELL_HALLOWS_END_SCARY_TIKI_MASK_2 = 100315,
SPELL_HALLOWS_END_FANCY_TOP_HAT = 100321
};
enum HallowsEndMiscSpells
{
SPELL_HALLOWS_END_DUMMY_NUKE = 21912,
SPELL_HALLOWS_END_DREAD_FERTILIZER = 191546
};
// 24930 - Hallow's End Candy
class spell_hallow_end_candy : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(CandysSpells);
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetCaster(), Trinity::Containers::SelectRandomContainerElement(CandysSpells), true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_hallow_end_candy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 24926 - Hallow's End Candy
class spell_hallow_end_candy_pirate : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_HALLOWS_END_CANDY_FEMALE_DEFIAS_PIRATE,
SPELL_HALLOWS_END_CANDY_MALE_DEFIAS_PIRATE
});
}
void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
uint32 spell = GetTarget()->GetNativeGender() == GENDER_FEMALE ? SPELL_HALLOWS_END_CANDY_FEMALE_DEFIAS_PIRATE : SPELL_HALLOWS_END_CANDY_MALE_DEFIAS_PIRATE;
GetTarget()->CastSpell(GetTarget(), spell, true);
}
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
uint32 spell = GetTarget()->GetNativeGender() == GENDER_FEMALE ? SPELL_HALLOWS_END_CANDY_FEMALE_DEFIAS_PIRATE : SPELL_HALLOWS_END_CANDY_MALE_DEFIAS_PIRATE;
GetTarget()->RemoveAurasDueToSpell(spell);
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_hallow_end_candy_pirate::HandleApply, EFFECT_0, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_hallow_end_candy_pirate::HandleRemove, EFFECT_0, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, AURA_EFFECT_HANDLE_REAL);
}
};
enum TrickSpells
{
SPELL_PIRATE_COSTUME_MALE = 24708,
SPELL_PIRATE_COSTUME_FEMALE = 24709,
SPELL_NINJA_COSTUME_MALE = 24710,
SPELL_NINJA_COSTUME_FEMALE = 24711,
SPELL_LEPER_GNOME_COSTUME_MALE = 24712,
SPELL_LEPER_GNOME_COSTUME_FEMALE = 24713,
SPELL_SKELETON_COSTUME = 24723,
SPELL_GHOST_COSTUME_MALE = 24735,
SPELL_GHOST_COSTUME_FEMALE = 24736,
SPELL_TRICK_BUFF = 24753,
};
// 24750 - Trick
class spell_hallow_end_trick : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_PIRATE_COSTUME_MALE,
SPELL_PIRATE_COSTUME_FEMALE,
SPELL_NINJA_COSTUME_MALE,
SPELL_NINJA_COSTUME_FEMALE,
SPELL_LEPER_GNOME_COSTUME_MALE,
SPELL_LEPER_GNOME_COSTUME_FEMALE,
SPELL_SKELETON_COSTUME,
SPELL_GHOST_COSTUME_MALE,
SPELL_GHOST_COSTUME_FEMALE,
SPELL_TRICK_BUFF
});
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (Player* target = GetHitPlayer())
{
uint8 gender = target->GetNativeGender();
uint32 spellId = SPELL_TRICK_BUFF;
switch (urand(0, 5))
{
case 1:
spellId = gender == GENDER_FEMALE ? SPELL_LEPER_GNOME_COSTUME_FEMALE : SPELL_LEPER_GNOME_COSTUME_MALE;
break;
case 2:
spellId = gender == GENDER_FEMALE ? SPELL_PIRATE_COSTUME_FEMALE : SPELL_PIRATE_COSTUME_MALE;
break;
case 3:
spellId = gender == GENDER_FEMALE ? SPELL_GHOST_COSTUME_FEMALE : SPELL_GHOST_COSTUME_MALE;
break;
case 4:
spellId = gender == GENDER_FEMALE ? SPELL_NINJA_COSTUME_FEMALE : SPELL_NINJA_COSTUME_MALE;
break;
case 5:
spellId = SPELL_SKELETON_COSTUME;
break;
default:
break;
}
caster->CastSpell(target, spellId, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_hallow_end_trick::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
enum TrickOrTreatSpells
{
SPELL_TRICK = 24714,
SPELL_TREAT = 24715,
SPELL_TRICKED_OR_TREATED = 24755,
SPELL_TRICKY_TREAT_SPEED = 42919,
SPELL_TRICKY_TREAT_TRIGGER = 42965,
SPELL_UPSET_TUMMY = 42966
};
// 24751 - Trick or Treat
class spell_hallow_end_trick_or_treat : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_TRICK, SPELL_TREAT, SPELL_TRICKED_OR_TREATED });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (Player* target = GetHitPlayer())
{
caster->CastSpell(target, roll_chance_i(50) ? SPELL_TRICK : SPELL_TREAT, true);
caster->CastSpell(target, SPELL_TRICKED_OR_TREATED, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_hallow_end_trick_or_treat::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 44436 - Tricky Treat
class spell_hallow_end_tricky_treat : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_TRICKY_TREAT_SPEED,
SPELL_TRICKY_TREAT_TRIGGER,
SPELL_UPSET_TUMMY
});
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (caster->HasAura(SPELL_TRICKY_TREAT_TRIGGER) && caster->GetAuraCount(SPELL_TRICKY_TREAT_SPEED) > 3 && roll_chance_i(33))
caster->CastSpell(caster, SPELL_UPSET_TUMMY, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_hallow_end_tricky_treat::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
enum HallowendData
{
SPELL_HALLOWED_WAND_PIRATE = 24717,
SPELL_HALLOWED_WAND_NINJA = 24718,
SPELL_HALLOWED_WAND_LEPER_GNOME = 24719,
SPELL_HALLOWED_WAND_RANDOM = 24720,
SPELL_HALLOWED_WAND_SKELETON = 24724,
SPELL_HALLOWED_WAND_WISP = 24733,
SPELL_HALLOWED_WAND_GHOST = 24737,
SPELL_HALLOWED_WAND_BAT = 24741
};
// 24717, 24718, 24719, 24720, 24724, 24733, 24737, 24741
class spell_hallow_end_wand : public SpellScript
{
bool Validate(SpellInfo const* /*spellEntry*/) override
{
return ValidateSpellInfo(
{
SPELL_PIRATE_COSTUME_MALE,
SPELL_PIRATE_COSTUME_FEMALE,
SPELL_NINJA_COSTUME_MALE,
SPELL_NINJA_COSTUME_FEMALE,
SPELL_LEPER_GNOME_COSTUME_MALE,
SPELL_LEPER_GNOME_COSTUME_FEMALE,
SPELL_GHOST_COSTUME_MALE,
SPELL_GHOST_COSTUME_FEMALE
});
}
void HandleScriptEffect()
{
Unit* caster = GetCaster();
Unit* target = GetHitUnit();
uint32 spellId = 0;
uint8 gender = target->GetNativeGender();
switch (GetSpellInfo()->Id)
{
case SPELL_HALLOWED_WAND_LEPER_GNOME:
spellId = gender ? SPELL_LEPER_GNOME_COSTUME_FEMALE : SPELL_LEPER_GNOME_COSTUME_MALE;
break;
case SPELL_HALLOWED_WAND_PIRATE:
spellId = gender ? SPELL_PIRATE_COSTUME_FEMALE : SPELL_PIRATE_COSTUME_MALE;
break;
case SPELL_HALLOWED_WAND_GHOST:
spellId = gender ? SPELL_GHOST_COSTUME_FEMALE : SPELL_GHOST_COSTUME_MALE;
break;
case SPELL_HALLOWED_WAND_NINJA:
spellId = gender ? SPELL_NINJA_COSTUME_FEMALE : SPELL_NINJA_COSTUME_MALE;
break;
case SPELL_HALLOWED_WAND_RANDOM:
spellId = RAND(SPELL_HALLOWED_WAND_PIRATE, SPELL_HALLOWED_WAND_NINJA, SPELL_HALLOWED_WAND_LEPER_GNOME, SPELL_HALLOWED_WAND_SKELETON, SPELL_HALLOWED_WAND_WISP, SPELL_HALLOWED_WAND_GHOST, SPELL_HALLOWED_WAND_BAT);
break;
default:
return;
}
caster->CastSpell(target, spellId, true);
}
void Register() override
{
AfterHit += SpellHitFn(spell_hallow_end_wand::HandleScriptEffect);
}
};
// 97135 - Children's Costume Aura
class spell_hallows_end_childrens_custome_aura : public AuraScript
{
static constexpr std::array ChildrensCustomeSpells =
{
SPELL_HALLOWS_END_SCARY_TIKI_MASK,
SPELL_HALLOWS_END_SCARY_WITCH_HAT,
SPELL_HALLOWS_END_SCARY_PUMPKIN_MASK,
SPELL_HALLOWS_END_SCARY_TIKI_MASK_2,
SPELL_HALLOWS_END_FANCY_TOP_HAT
};
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(ChildrensCustomeSpells);
}
void HandleAfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
GetTarget()->CastSpell(GetTarget(), Trinity::Containers::SelectRandomContainerElement(ChildrensCustomeSpells), aurEff);
}
void HandlePeriodic(AuraEffect const* aurEff)
{
for (uint32 spell : ChildrensCustomeSpells)
GetTarget()->RemoveAura(spell);
GetTarget()->CastSpell(GetTarget(), Trinity::Containers::SelectRandomContainerElement(ChildrensCustomeSpells), aurEff);
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_hallows_end_childrens_custome_aura::HandleAfterApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_hallows_end_childrens_custome_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 191547 - Powder Blast
class spell_hallows_end_powder_blast : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_HALLOWS_END_DUMMY_NUKE, SPELL_HALLOWS_END_DREAD_FERTILIZER });
}
void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
{
GetTarget()->CastSpell(GetTarget(), SPELL_HALLOWS_END_DUMMY_NUKE);
eventInfo.GetProcTarget()->CastSpell(GetTarget(), SPELL_HALLOWS_END_DREAD_FERTILIZER);
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_hallows_end_powder_blast::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
void AddSC_event_hallows_end()
{
RegisterSpellScript(spell_hallow_end_candy);
RegisterSpellScript(spell_hallow_end_candy_pirate);
RegisterSpellScript(spell_hallow_end_trick);
RegisterSpellScript(spell_hallow_end_trick_or_treat);
RegisterSpellScript(spell_hallow_end_tricky_treat);
RegisterSpellScript(spell_hallow_end_wand);
RegisterSpellScript(spell_hallows_end_childrens_custome_aura);
RegisterSpellScript(spell_hallows_end_powder_blast);
}