Core/Scripts: Import missing gen/item scripts

This commit is contained in:
roc13x
2017-05-05 04:26:38 +01:00
parent 1e475a6942
commit 97e8b18ceb
2 changed files with 442 additions and 6 deletions

View File

@@ -493,6 +493,61 @@ class spell_gen_bandage : public SpellScriptLoader
}
};
// Blood Reserve - 64568
enum BloodReserve
{
SPELL_GEN_BLOOD_RESERVE_AURA = 64568,
SPELL_GEN_BLOOD_RESERVE_HEAL = 64569
};
class spell_gen_blood_reserve : public SpellScriptLoader
{
public:
spell_gen_blood_reserve() : SpellScriptLoader("spell_gen_blood_reserve") { }
class spell_gen_blood_reserve_AuraScript : public AuraScript
{
PrepareAuraScript(spell_gen_blood_reserve_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_GEN_BLOOD_RESERVE_HEAL))
return false;
return true;
}
bool CheckProc(ProcEventInfo& eventInfo)
{
if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo())
if (Unit* caster = eventInfo.GetActionTarget())
if (caster->HealthBelowPctDamaged(35, dmgInfo->GetDamage()))
return true;
return false;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActionTarget();
caster->CastCustomSpell(SPELL_GEN_BLOOD_RESERVE_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), caster, TRIGGERED_FULL_MASK, nullptr, aurEff);
caster->RemoveAura(SPELL_GEN_BLOOD_RESERVE_AURA);
}
void Register() override
{
DoCheckProc += AuraCheckProcFn(spell_gen_blood_reserve_AuraScript::CheckProc);
OnEffectProc += AuraEffectProcFn(spell_gen_blood_reserve_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_gen_blood_reserve_AuraScript();
}
};
// Blade Warding - 64440
enum BladeWarding
{
@@ -4202,6 +4257,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_aura_service_uniform();
new spell_gen_av_drekthar_presence();
new spell_gen_bandage();
new spell_gen_blood_reserve();
new spell_gen_blade_warding();
new spell_gen_bonked();
new spell_gen_break_shield("spell_gen_break_shield");

View File

@@ -1114,6 +1114,46 @@ class spell_item_gnomish_death_ray : public SpellScriptLoader
}
};
// Item 10721: Gnomish Harm Prevention Belt
// 13234 - Harm Prevention Belt
enum HarmPreventionBelt
{
SPELL_FORCEFIELD_COLLAPSE = 13235
};
class spell_item_harm_prevention_belt : public SpellScriptLoader
{
public:
spell_item_harm_prevention_belt() : SpellScriptLoader("spell_item_harm_prevention_belt") { }
class spell_item_harm_prevention_belt_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_harm_prevention_belt_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_FORCEFIELD_COLLAPSE))
return false;
return true;
}
void HandleProc(ProcEventInfo& /*eventInfo*/)
{
GetTarget()->CastSpell((Unit*)nullptr, SPELL_FORCEFIELD_COLLAPSE, true);
}
void Register() override
{
OnProc += AuraProcFn(spell_item_harm_prevention_belt_AuraScript::HandleProc);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_item_harm_prevention_belt_AuraScript();
}
};
// Item 23004 - Idol of Longevity
// 28847 - Healing Touch Refund
enum IdolOfLongevity
@@ -4156,7 +4196,7 @@ public:
Unit* target = GetCaster();
if (target->getPowerType() == POWER_MANA)
availableElixirs.push_back(28509); // Elixir of Major Mageblood (22840)
availableElixirs.push_back(28509); // Elixir of Major Mageblood (22840)
uint32 chosenElixir = Trinity::Containers::SelectRandomContainerElement(availableElixirs);
@@ -4168,13 +4208,13 @@ public:
if (sSpellMgr->IsSpellMemberOfSpellGroup(chosenElixir, SPELL_GROUP_ELIXIR_GUARDIAN))
chosenSpellGroup = SPELL_GROUP_ELIXIR_GUARDIAN;
// If another spell of the same group is already active the elixir should not be cast
if (chosenSpellGroup)
if (chosenSpellGroup != SPELL_GROUP_NONE)
{
Unit::AuraApplicationMap& Auras = target->GetAppliedAuras();
for (Unit::AuraApplicationMap::iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
Unit::AuraApplicationMap const& auraMap = target->GetAppliedAuras();
for (auto itr = auraMap.begin(); itr != auraMap.end(); ++itr)
{
uint32 spell_id = itr->second->GetBase()->GetId();
if (sSpellMgr->IsSpellMemberOfSpellGroup(spell_id, chosenSpellGroup) && spell_id != chosenElixir)
uint32 spellId = itr->second->GetBase()->GetId();
if (sSpellMgr->IsSpellMemberOfSpellGroup(spellId, chosenSpellGroup) && spellId != chosenElixir)
{
useElixir = false;
break;
@@ -4251,6 +4291,336 @@ public:
}
};
enum DeathChoiceSpells
{
SPELL_DEATH_CHOICE_NORMAL_AURA = 67702,
SPELL_DEATH_CHOICE_NORMAL_AGILITY = 67703,
SPELL_DEATH_CHOICE_NORMAL_STRENGTH = 67708,
SPELL_DEATH_CHOICE_HEROIC_AURA = 67771,
SPELL_DEATH_CHOICE_HEROIC_AGILITY = 67772,
SPELL_DEATH_CHOICE_HEROIC_STRENGTH = 67773
};
class spell_item_death_choice : public SpellScriptLoader
{
public:
spell_item_death_choice() : SpellScriptLoader("spell_item_death_choice") { }
class spell_item_death_choice_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_death_choice_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_NORMAL_STRENGTH) ||
!sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_NORMAL_AGILITY) ||
!sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_HEROIC_STRENGTH) ||
!sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_HEROIC_AGILITY))
return false;
return true;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActor();
float str = caster->GetStat(STAT_STRENGTH);
float agi = caster->GetStat(STAT_AGILITY);
switch (aurEff->GetId())
{
case SPELL_DEATH_CHOICE_NORMAL_AURA:
{
if (str > agi)
caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_STRENGTH, true, nullptr, aurEff);
else
caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_AGILITY, true, nullptr, aurEff);
break;
}
case SPELL_DEATH_CHOICE_HEROIC_AURA:
{
if (str > agi)
caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_STRENGTH, true, nullptr, aurEff);
else
caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_AGILITY, true, nullptr, aurEff);
break;
}
default:
break;
}
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_item_death_choice_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_item_death_choice_AuraScript();
}
};
enum TrinketStackSpells
{
SPELL_LIGHTNING_CAPACITOR_AURA = 37657, // Lightning Capacitor
SPELL_LIGHTNING_CAPACITOR_STACK = 37658,
SPELL_LIGHTNING_CAPACITOR_TRIGGER = 37661,
SPELL_THUNDER_CAPACITOR_AURA = 54841, // Thunder Capacitor
SPELL_THUNDER_CAPACITOR_STACK = 54842,
SPELL_THUNDER_CAPACITOR_TRIGGER = 54843,
SPELL_TOC25_CASTER_TRINKET_NORMAL_AURA = 67712, // Item - Coliseum 25 Normal Caster Trinket
SPELL_TOC25_CASTER_TRINKET_NORMAL_STACK = 67713,
SPELL_TOC25_CASTER_TRINKET_NORMAL_TRIGGER = 67714,
SPELL_TOC25_CASTER_TRINKET_HEROIC_AURA = 67758, // Item - Coliseum 25 Heroic Caster Trinket
SPELL_TOC25_CASTER_TRINKET_HEROIC_STACK = 67759,
SPELL_TOC25_CASTER_TRINKET_HEROIC_TRIGGER = 67760,
};
class spell_item_trinket_stack : public SpellScriptLoader
{
public:
spell_item_trinket_stack(char const* scriptName, uint32 stackSpell, uint32 triggerSpell) : SpellScriptLoader(scriptName),
_stackSpell(stackSpell), _triggerSpell(triggerSpell)
{
}
class spell_item_trinket_stack_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_trinket_stack_AuraScript);
public:
spell_item_trinket_stack_AuraScript(uint32 stackSpell, uint32 triggerSpell) : _stackSpell(stackSpell), _triggerSpell(triggerSpell)
{
}
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(_stackSpell) || !sSpellMgr->GetSpellInfo(_triggerSpell))
return false;
return true;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActor();
caster->CastSpell(caster, _stackSpell, true, nullptr, aurEff); // cast the stack
Aura* dummy = caster->GetAura(_stackSpell); // retrieve aura
//dont do anything if it's not the right amount of stacks;
if (!dummy || dummy->GetStackAmount() < aurEff->GetAmount())
return;
// if right amount, remove the aura and cast real trigger
caster->RemoveAurasDueToSpell(_stackSpell);
if (Unit* target = eventInfo.GetActionTarget())
caster->CastSpell(target, _triggerSpell, true, nullptr, aurEff);
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_item_trinket_stack_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
private:
uint32 _stackSpell;
uint32 _triggerSpell;
};
AuraScript* GetAuraScript() const override
{
return new spell_item_trinket_stack_AuraScript(_stackSpell, _triggerSpell);
}
private:
uint32 _stackSpell;
uint32 _triggerSpell;
};
// 57345 - Darkmoon Card: Greatness
enum DarkmoonCardSpells
{
SPELL_DARKMOON_CARD_STRENGHT = 60229,
SPELL_DARKMOON_CARD_AGILITY = 60233,
SPELL_DARKMOON_CARD_INTELLECT = 60234,
SPELL_DARKMOON_CARD_SPIRIT = 60235,
};
class spell_item_darkmoon_card_greatness : public SpellScriptLoader
{
public:
spell_item_darkmoon_card_greatness() : SpellScriptLoader("spell_item_darkmoon_card_greatness") { }
class spell_item_darkmoon_card_greatness_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_darkmoon_card_greatness_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_STRENGHT) ||
!sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_AGILITY) ||
!sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_INTELLECT) ||
!sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_SPIRIT))
return false;
return true;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActor();
float str = caster->GetStat(STAT_STRENGTH);
float agi = caster->GetStat(STAT_AGILITY);
float intl = caster->GetStat(STAT_INTELLECT);
float spi = caster->GetStat(STAT_SPIRIT);
float stat = 0.0f;
uint32 spellTrigger = SPELL_DARKMOON_CARD_STRENGHT;
if (str > stat)
{
spellTrigger = SPELL_DARKMOON_CARD_STRENGHT;
stat = str;
}
if (agi > stat)
{
spellTrigger = SPELL_DARKMOON_CARD_AGILITY;
stat = agi;
}
if (intl > stat)
{
spellTrigger = SPELL_DARKMOON_CARD_INTELLECT;
stat = intl;
}
if (spi > stat)
{
spellTrigger = SPELL_DARKMOON_CARD_SPIRIT;
stat = spi;
}
caster->CastSpell(caster, spellTrigger, true, nullptr, aurEff);
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_item_darkmoon_card_greatness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_item_darkmoon_card_greatness_AuraScript();
}
};
// 43820 - Amani Charm of the Witch Doctor
enum CharmWitchDoctor
{
SPELL_CHARM_WITCH_DOCTOR_PROC = 43821
};
class spell_item_charm_witch_doctor : public SpellScriptLoader
{
public:
spell_item_charm_witch_doctor() : SpellScriptLoader("spell_item_charm_witch_doctor") { }
class spell_item_charm_witch_doctor_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_charm_witch_doctor_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_CHARM_WITCH_DOCTOR_PROC))
return false;
return true;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActor();
Unit* target = eventInfo.GetActionTarget();
if (target)
{
int32 bp = CalculatePct(target->GetCreateHealth(),aurEff->GetSpellInfo()->Effects[1].CalcValue());
caster->CastCustomSpell(target, SPELL_CHARM_WITCH_DOCTOR_PROC, &bp, nullptr, nullptr, true, nullptr, aurEff);
}
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_item_charm_witch_doctor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_item_charm_witch_doctor_AuraScript();
}
};
// 27522,40336 - Mana Drain
enum ManaDrainSpells
{
SPELL_MANA_DRAIN_ENERGIZE = 29471,
SPELL_MANA_DRAIN_LEECH = 27526
};
class spell_item_mana_drain : public SpellScriptLoader
{
public:
spell_item_mana_drain() : SpellScriptLoader("spell_item_mana_drain") { }
class spell_item_mana_drain_AuraScript : public AuraScript
{
PrepareAuraScript(spell_item_mana_drain_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_MANA_DRAIN_ENERGIZE)
|| !sSpellMgr->GetSpellInfo(SPELL_MANA_DRAIN_LEECH))
return false;
return true;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
Unit* caster = eventInfo.GetActor();
Unit* target = eventInfo.GetActionTarget();
if (caster->IsAlive())
caster->CastSpell(caster, SPELL_MANA_DRAIN_ENERGIZE, true, nullptr, aurEff);
if (target && target->IsAlive())
caster->CastSpell(target, SPELL_MANA_DRAIN_LEECH, true, nullptr, aurEff);
}
void Register() override
{
OnEffectProc += AuraEffectProcFn(spell_item_mana_drain_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_item_mana_drain_AuraScript();
}
};
void AddSC_item_spell_scripts()
{
// 23074 Arcanite Dragonling
@@ -4286,6 +4656,7 @@ void AddSC_item_spell_scripts()
new spell_item_flask_of_the_north();
new spell_item_frozen_shadoweave();
new spell_item_gnomish_death_ray();
new spell_item_harm_prevention_belt();
new spell_item_healing_touch_refund();
new spell_item_heartpierce<SPELL_INVIGORATION_ENERGY, SPELL_INVIGORATION_MANA, SPELL_INVIGORATION_RAGE, SPELL_INVIGORATION_RP>("spell_item_heartpierce");
new spell_item_heartpierce<SPELL_INVIGORATION_ENERGY_HERO, SPELL_INVIGORATION_MANA_HERO, SPELL_INVIGORATION_RAGE_HERO, SPELL_INVIGORATION_RP_HERO>("spell_item_heartpierce_hero");
@@ -4351,6 +4722,15 @@ void AddSC_item_spell_scripts()
new spell_item_toy_train_set_pulse();
new spell_item_taunt_flag_targeting();
new spell_item_death_choice();
new spell_item_trinket_stack("spell_item_lightning_capacitor", SPELL_LIGHTNING_CAPACITOR_STACK, SPELL_LIGHTNING_CAPACITOR_TRIGGER);
new spell_item_trinket_stack("spell_item_thunder_capacitor", SPELL_THUNDER_CAPACITOR_STACK, SPELL_THUNDER_CAPACITOR_TRIGGER);
new spell_item_trinket_stack("spell_item_toc25_normal_caster_trinket", SPELL_TOC25_CASTER_TRINKET_NORMAL_STACK, SPELL_TOC25_CASTER_TRINKET_NORMAL_TRIGGER);
new spell_item_trinket_stack("spell_item_toc25_heroic_caster_trinket", SPELL_TOC25_CASTER_TRINKET_HEROIC_STACK, SPELL_TOC25_CASTER_TRINKET_HEROIC_TRIGGER);
new spell_item_darkmoon_card_greatness();
new spell_item_charm_witch_doctor();
new spell_item_mana_drain();
new spell_item_mind_control_cap();
new spell_item_universal_remote();
new spell_item_zandalarian_charm("spell_item_unstable_power", SPELL_UNSTABLE_POWER_AURA_STACK);