/*
* 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 "SpellAuraEffects.h"
#include "SpellScript.h"
enum Mistletoe
{
SPELL_CREATE_MISTLETOE = 26206,
SPELL_CREATE_HOLLY = 26207,
SPELL_CREATE_SNOWFLAKES = 45036
};
// 26218 - Mistletoe
class spell_winter_veil_mistletoe : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_CREATE_MISTLETOE,
SPELL_CREATE_HOLLY,
SPELL_CREATE_SNOWFLAKES
});
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* target = GetHitPlayer())
{
uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES);
GetCaster()->CastSpell(target, spellId, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_mistletoe::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
enum PX238WinterWondervolt
{
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1 = 26157,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2 = 26272,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3 = 26273,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4 = 26274
};
std::array const WonderboltTransformSpells =
{
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3,
SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4
};
// 26275 - PX-238 Winter Wondervolt TRAP
class spell_winter_veil_px_238_winter_wondervolt : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(WonderboltTransformSpells);
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
{
for (uint32 spell : WonderboltTransformSpells)
if (target->HasAura(spell))
return;
target->CastSpell(target, Trinity::Containers::SelectRandomContainerElement(WonderboltTransformSpells), true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_px_238_winter_wondervolt::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
enum ReindeerTransformation
{
SPELL_FLYING_REINDEER_310 = 44827,
SPELL_FLYING_REINDEER_280 = 44825,
SPELL_FLYING_REINDEER_60 = 44824,
SPELL_REINDEER_100 = 25859,
SPELL_REINDEER_60 = 25858,
};
// 25860 - Reindeer Transformation
class spell_winter_veil_reindeer_transformation : public SpellScript
{
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(
{
SPELL_FLYING_REINDEER_310,
SPELL_FLYING_REINDEER_280,
SPELL_FLYING_REINDEER_60,
SPELL_REINDEER_100,
SPELL_REINDEER_60
});
}
void HandleDummy(SpellEffIndex /* effIndex */)
{
Unit* caster = GetCaster();
if (caster->HasAuraType(SPELL_AURA_MOUNTED))
{
float flyspeed = caster->GetSpeedRate(MOVE_FLIGHT);
float speed = caster->GetSpeedRate(MOVE_RUN);
caster->RemoveAurasByType(SPELL_AURA_MOUNTED);
//5 different spells used depending on mounted speed and if mount can fly or not
if (flyspeed >= 4.1f)
// Flying Reindeer
caster->CastSpell(caster, SPELL_FLYING_REINDEER_310, true); //310% flying Reindeer
else if (flyspeed >= 3.8f)
// Flying Reindeer
caster->CastSpell(caster, SPELL_FLYING_REINDEER_280, true); //280% flying Reindeer
else if (flyspeed >= 1.6f)
// Flying Reindeer
caster->CastSpell(caster, SPELL_FLYING_REINDEER_60, true); //60% flying Reindeer
else if (speed >= 2.0f)
// Reindeer
caster->CastSpell(caster, SPELL_REINDEER_100, true); //100% ground Reindeer
else
// Reindeer
caster->CastSpell(caster, SPELL_REINDEER_60, true); //60% ground Reindeer
}
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_winter_veil_reindeer_transformation::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_event_winter_veil()
{
RegisterSpellScript(spell_winter_veil_mistletoe);
RegisterSpellScript(spell_winter_veil_px_238_winter_wondervolt);
RegisterSpellScript(spell_winter_veil_reindeer_transformation);
}