diff options
-rw-r--r-- | sql/updates/world/2013_07_17_04_world_spell_script_names.sql | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 3640 | ||||
-rw-r--r-- | src/server/scripts/World/go_scripts.cpp | 74 |
3 files changed, 1854 insertions, 1864 deletions
diff --git a/sql/updates/world/2013_07_17_04_world_spell_script_names.sql b/sql/updates/world/2013_07_17_04_world_spell_script_names.sql new file mode 100644 index 00000000000..acec312eb92 --- /dev/null +++ b/sql/updates/world/2013_07_17_04_world_spell_script_names.sql @@ -0,0 +1,4 @@ +UPDATE `spell_script_names` SET `ScriptName`='spell_gen_clone' WHERE `ScriptName`='spell_generic_clone'; +UPDATE `spell_script_names` SET `ScriptName`='spell_gen_clone_weapon' WHERE `ScriptName`='spell_generic_clone_weapon'; +UPDATE `spell_script_names` SET `ScriptName`='spell_gen_30pct_count_pct_from_max_hp' WHERE `ScriptName`='spell_gen_touch_the_nightmare'; +UPDATE `spell_script_names` SET `ScriptName`='spell_gen_creature_permanent_feign_death' WHERE `ScriptName`='spell_creature_permanent_feign_death'; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e1928060100..2356d5d27f4 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -62,7 +62,7 @@ class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader void Register() OVERRIDE { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0); } }; @@ -163,962 +163,566 @@ class spell_gen_adaptive_warding : public SpellScriptLoader } }; -// 41337 Aura of Anger -class spell_gen_aura_of_anger : public SpellScriptLoader -{ - public: - spell_gen_aura_of_anger() : SpellScriptLoader("spell_gen_aura_of_anger") { } - - class spell_gen_aura_of_anger_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_aura_of_anger_AuraScript); - - void HandleEffectPeriodicUpdate(AuraEffect* aurEff) - { - if (AuraEffect* aurEff1 = aurEff->GetBase()->GetEffect(EFFECT_1)) - aurEff1->ChangeAmount(aurEff1->GetAmount() + 5); - aurEff->SetAmount(100 * aurEff->GetTickNumber()); - } - - void Register() OVERRIDE - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_aura_of_anger_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_gen_aura_of_anger_AuraScript(); - } -}; - -class spell_gen_av_drekthar_presence : public SpellScriptLoader -{ - public: - spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { } - - class spell_gen_av_drekthar_presence_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript); - - bool CheckAreaTarget(Unit* target) - { - switch (target->GetEntry()) - { - // alliance - case 14762: // Dun Baldar North Marshal - case 14763: // Dun Baldar South Marshal - case 14764: // Icewing Marshal - case 14765: // Stonehearth Marshal - case 11948: // Vandar Stormspike - // horde - case 14772: // East Frostwolf Warmaster - case 14776: // Tower Point Warmaster - case 14773: // Iceblood Warmaster - case 14777: // West Frostwolf Warmaster - case 11946: // Drek'thar - return true; - default: - return false; - break; - } - } - void Register() OVERRIDE - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget); - } - }; - - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_gen_av_drekthar_presence_AuraScript(); - } -}; - -// 46394 Brutallus Burn -class spell_gen_burn_brutallus : public SpellScriptLoader +class spell_gen_allow_cast_from_item_only : public SpellScriptLoader { public: - spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { } + spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } - class spell_gen_burn_brutallus_AuraScript : public AuraScript + class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_burn_brutallus_AuraScript); + PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); - void HandleEffectPeriodicUpdate(AuraEffect* aurEff) + SpellCastResult CheckRequirement() { - if (aurEff->GetTickNumber() % 11 == 0) - aurEff->SetAmount(aurEff->GetAmount() * 2); + if (!GetCastItem()) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + return SPELL_CAST_OK; } void Register() OVERRIDE { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_burn_brutallus_AuraScript(); + return new spell_gen_allow_cast_from_item_only_SpellScript(); } }; -enum CannibalizeSpells +enum AnimalBloodPoolSpell { - SPELL_CANNIBALIZE_TRIGGERED = 20578, + SPELL_ANIMAL_BLOOD = 46221, + SPELL_SPAWN_BLOOD_POOL = 63471 }; -class spell_gen_cannibalize : public SpellScriptLoader +class spell_gen_animal_blood : public SpellScriptLoader { public: - spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { } + spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { } - class spell_gen_cannibalize_SpellScript : public SpellScript + class spell_gen_animal_blood_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_cannibalize_SpellScript); + PrepareAuraScript(spell_gen_animal_blood_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED)) + if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL)) return false; return true; } - SpellCastResult CheckIfCorpseNear() + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - Unit* caster = GetCaster(); - float max_range = GetSpellInfo()->GetMaxRange(false); - WorldObject* result = NULL; - // search for nearby enemy corpse in range - Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY); - Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check); - caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); - if (!result) - return SPELL_FAILED_NO_EDIBLE_CORPSES; - return SPELL_CAST_OK; + // Remove all auras with spell id 46221, except the one currently being applied + while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, 0, 0, 0, GetAura())) + GetUnitOwner()->RemoveOwnedAura(aur); } - void HandleDummy(SpellEffIndex /*effIndex*/) + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - Unit* caster = GetCaster(); - caster->CastSpell(caster, SPELL_CANNIBALIZE_TRIGGERED, false); + if (Unit* owner = GetUnitOwner()) + if (owner->IsInWater()) + owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear); + AfterEffectApply += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_cannibalize_SpellScript(); + return new spell_gen_animal_blood_AuraScript(); } }; -// 63845 - Create Lance -enum CreateLanceSpells -{ - SPELL_CREATE_LANCE_ALLIANCE = 63914, - SPELL_CREATE_LANCE_HORDE = 63919 -}; - -class spell_gen_create_lance : public SpellScriptLoader +// 41337 Aura of Anger +class spell_gen_aura_of_anger : public SpellScriptLoader { public: - spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { } + spell_gen_aura_of_anger() : SpellScriptLoader("spell_gen_aura_of_anger") { } - class spell_gen_create_lance_SpellScript : public SpellScript + class spell_gen_aura_of_anger_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_create_lance_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE)) - return false; - return true; - } + PrepareAuraScript(spell_gen_aura_of_anger_AuraScript); - void HandleScript(SpellEffIndex effIndex) + void HandleEffectPeriodicUpdate(AuraEffect* aurEff) { - PreventHitDefaultEffect(effIndex); - - if (Player* target = GetHitPlayer()) - { - if (target->GetTeam() == ALLIANCE) - GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true); - else - GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true); - } + if (AuraEffect* aurEff1 = aurEff->GetBase()->GetEffect(EFFECT_1)) + aurEff1->ChangeAmount(aurEff1->GetAmount() + 5); + aurEff->SetAmount(100 * aurEff->GetTickNumber()); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_aura_of_anger_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_create_lance_SpellScript(); + return new spell_gen_aura_of_anger_AuraScript(); } }; -// 28702 - Netherbloom -enum Netherbloom +enum ServiceUniform { - SPELL_NETHERBLOOM_POLLEN_1 = 28703 + // Spells + SPELL_SERVICE_UNIFORM = 71450, + + // Models + MODEL_GOBLIN_MALE = 31002, + MODEL_GOBLIN_FEMALE = 31003 }; -class spell_gen_netherbloom : public SpellScriptLoader +class spell_gen_aura_service_uniform : public SpellScriptLoader { public: - spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { } + spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { } - class spell_gen_netherbloom_SpellScript : public SpellScript + class spell_gen_aura_service_uniform_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_netherbloom_SpellScript); + PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - for (uint8 i = 0; i < 5; ++i) - if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i)) - return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM)) + return false; return true; } - void HandleScript(SpellEffIndex effIndex) + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PreventHitDefaultEffect(effIndex); - - if (Unit* target = GetHitUnit()) + // Apply model goblin + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) { - // 25% chance of casting a random buff - if (roll_chance_i(75)) - return; - - // triggered spells are 28703 to 28707 - // Note: some sources say, that there was the possibility of - // receiving a debuff. However, this seems to be removed by a patch. - - // don't overwrite an existing aura - for (uint8 i = 0; i < 5; ++i) - if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i)) - return; - - target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true); + if (target->getGender() == GENDER_MALE) + target->SetDisplayId(MODEL_GOBLIN_MALE); + else + target->SetDisplayId(MODEL_GOBLIN_FEMALE); } } - void Register() OVERRIDE - { - OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_netherbloom_SpellScript(); - } -}; - -// 28720 - Nightmare Vine -enum NightmareVine -{ - SPELL_NIGHTMARE_POLLEN = 28721 -}; - -class spell_gen_nightmare_vine : public SpellScriptLoader -{ - public: - spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { } - - class spell_gen_nightmare_vine_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_nightmare_vine_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PreventHitDefaultEffect(effIndex); - - if (Unit* target = GetHitUnit()) - { - // 25% chance of casting Nightmare Pollen - if (roll_chance_i(25)) - target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true); - } + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->RestoreDisplayId(); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_nightmare_vine_SpellScript(); + return new spell_gen_aura_service_uniform_AuraScript(); } }; -// 27539 - Obsidian Armor -enum ObsidianArmor -{ - SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536, - SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533, - SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538, - SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534, - SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535, - SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540 -}; - -class spell_gen_obsidian_armor : public SpellScriptLoader +class spell_gen_av_drekthar_presence : public SpellScriptLoader { public: - spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { } + spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { } - class spell_gen_obsidian_armor_AuraScript : public AuraScript + class spell_gen_av_drekthar_presence_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_obsidian_armor_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) || - !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) || - !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) || - !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) || - !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) || - !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() - return false; - - if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL) - return false; - - return true; - } + PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript); - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckAreaTarget(Unit* target) { - PreventDefaultAction(); - - uint32 spellId = 0; - switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) + switch (target->GetEntry()) { - case SPELL_SCHOOL_HOLY: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY; - break; - case SPELL_SCHOOL_FIRE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE; - break; - case SPELL_SCHOOL_NATURE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE; - break; - case SPELL_SCHOOL_FROST: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST; - break; - case SPELL_SCHOOL_SHADOW: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW; - break; - case SPELL_SCHOOL_ARCANE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE; - break; + // alliance + case 14762: // Dun Baldar North Marshal + case 14763: // Dun Baldar South Marshal + case 14764: // Icewing Marshal + case 14765: // Stonehearth Marshal + case 11948: // Vandar Stormspike + // horde + case 14772: // East Frostwolf Warmaster + case 14776: // Tower Point Warmaster + case 14773: // Iceblood Warmaster + case 14777: // West Frostwolf Warmaster + case 11946: // Drek'thar + return true; default: - return; + return false; } - GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); } void Register() OVERRIDE { - DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget); } }; AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_obsidian_armor_AuraScript(); + return new spell_gen_av_drekthar_presence_AuraScript(); } }; -// 45472 Parachute -enum ParachuteSpells +enum GenericBandage { - SPELL_PARACHUTE = 45472, - SPELL_PARACHUTE_BUFF = 44795, + SPELL_RECENTLY_BANDAGED = 11196 }; -class spell_gen_parachute : public SpellScriptLoader +class spell_gen_bandage : public SpellScriptLoader { public: - spell_gen_parachute() : SpellScriptLoader("spell_gen_parachute") { } + spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { } - class spell_gen_parachute_AuraScript : public AuraScript + class spell_gen_bandage_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_parachute_AuraScript); + PrepareSpellScript(spell_gen_bandage_SpellScript); - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) || !sSpellMgr->GetSpellInfo(SPELL_PARACHUTE_BUFF)) + if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED)) return false; return true; } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - if (Player* target = GetTarget()->ToPlayer()) - if (target->IsFalling()) - { - target->RemoveAurasDueToSpell(SPELL_PARACHUTE); - target->CastSpell(target, SPELL_PARACHUTE_BUFF, true); - } - } - - void Register() OVERRIDE - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_gen_parachute_AuraScript(); - } -}; - -enum NPCEntries -{ - NPC_DOOMGUARD = 11859, - NPC_INFERNAL = 89, - NPC_IMP = 416, -}; - -class spell_gen_pet_summoned : public SpellScriptLoader -{ - public: - spell_gen_pet_summoned() : SpellScriptLoader("spell_gen_pet_summoned") { } - - class spell_gen_pet_summoned_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_pet_summoned_SpellScript); - - bool Load() OVERRIDE - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex /*effIndex*/) + SpellCastResult CheckCast() { - Player* player = GetCaster()->ToPlayer(); - if (player->GetLastPetNumber()) + if (Unit* target = GetExplTargetUnit()) { - PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET; - if (Pet* newPet = new Pet(player, newPetType)) - { - if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true)) - { - // revive the pet if it is dead - if (newPet->getDeathState() == DEAD) - newPet->setDeathState(ALIVE); - - newPet->SetFullHealth(); - newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType())); - - switch (newPet->GetEntry()) - { - case NPC_DOOMGUARD: - case NPC_INFERNAL: - newPet->SetEntry(NPC_IMP); - break; - default: - break; - } - } - else - delete newPet; - } + if (target->HasAura(SPELL_RECENTLY_BANDAGED)) + return SPELL_FAILED_TARGET_AURASTATE; } + return SPELL_CAST_OK; } - void Register() OVERRIDE - { - OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_pet_summoned_SpellScript(); - } -}; - -class spell_gen_remove_flight_auras : public SpellScriptLoader -{ - public: - spell_gen_remove_flight_auras() : SpellScriptLoader("spell_gen_remove_flight_auras") {} - - class spell_gen_remove_flight_auras_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_remove_flight_auras_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + void HandleScript() { if (Unit* target = GetHitUnit()) - { - target->RemoveAurasByType(SPELL_AURA_FLY); - target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); - } + GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast); + AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_remove_flight_auras_SpellScript(); + return new spell_gen_bandage_SpellScript(); } }; -enum EluneCandle +enum Bonked { - NPC_OMEN = 15467, - - SPELL_ELUNE_CANDLE_OMEN_HEAD = 26622, - SPELL_ELUNE_CANDLE_OMEN_CHEST = 26624, - SPELL_ELUNE_CANDLE_OMEN_HAND_R = 26625, - SPELL_ELUNE_CANDLE_OMEN_HAND_L = 26649, - SPELL_ELUNE_CANDLE_NORMAL = 26636, + SPELL_BONKED = 62991, + SPELL_FOAM_SWORD_DEFEAT = 62994, + SPELL_ON_GUARD = 62972 }; -class spell_gen_elune_candle : public SpellScriptLoader +class spell_gen_bonked : public SpellScriptLoader { public: - spell_gen_elune_candle() : SpellScriptLoader("spell_gen_elune_candle") {} + spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { } - class spell_gen_elune_candle_SpellScript : public SpellScript + class spell_gen_bonked_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_elune_candle_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_R)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_L)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_NORMAL)) - return false; - return true; - } + PrepareSpellScript(spell_gen_bonked_SpellScript); void HandleScript(SpellEffIndex /*effIndex*/) { - uint32 spellId = 0; - - if (GetHitUnit()->GetEntry() == NPC_OMEN) + if (Player* target = GetHitPlayer()) { - switch (urand(0, 3)) + Aura const* aura = GetHitAura(); + if (!(aura && aura->GetStackAmount() == 3)) + return; + + target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true); + target->RemoveAurasDueToSpell(SPELL_BONKED); + + if (Aura const* aura = target->GetAura(SPELL_ON_GUARD)) { - case 0: spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD; break; - case 1: spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST; break; - case 2: spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R; break; - case 3: spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L; break; + if (Item* item = target->GetItemByGuid(aura->GetCastItemGUID())) + target->DestroyItemCount(item->GetEntry(), 1, true); } } - else - spellId = SPELL_ELUNE_CANDLE_NORMAL; - - GetCaster()->CastSpell(GetHitUnit(), spellId, true, NULL); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_elune_candle_SpellScript(); + return new spell_gen_bonked_SpellScript(); } }; -class spell_creature_permanent_feign_death : public SpellScriptLoader -{ - public: - spell_creature_permanent_feign_death() : SpellScriptLoader("spell_creature_permanent_feign_death") { } - - class spell_creature_permanent_feign_death_AuraScript : public AuraScript - { - PrepareAuraScript(spell_creature_permanent_feign_death_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->SetReactState(REACT_PASSIVE); - } +/* DOCUMENTATION: Break-Shield spells + Break-Shield spells can be classified in three groups: - void Register() OVERRIDE - { - OnEffectApply += AuraEffectApplyFn(spell_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + - Spells on vehicle bar used by players: + + EFFECT_0: SCRIPT_EFFECT + + EFFECT_1: NONE + + EFFECT_2: NONE + - Spells casted by players triggered by script: + + EFFECT_0: SCHOOL_DAMAGE + + EFFECT_1: SCRIPT_EFFECT + + EFFECT_2: FORCE_CAST + - Spells casted by NPCs on players: + + EFFECT_0: SCHOOL_DAMAGE + + EFFECT_1: SCRIPT_EFFECT + + EFFECT_2: NONE - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_creature_permanent_feign_death_AuraScript(); - } -}; + In the following script we handle the SCRIPT_EFFECT for effIndex EFFECT_0 and EFFECT_1. + - When handling EFFECT_0 we're in the "Spells on vehicle bar used by players" case + and we'll trigger "Spells casted by players triggered by script" + - When handling EFFECT_1 we're in the "Spells casted by players triggered by script" + or "Spells casted by NPCs on players" so we'll search for the first defend layer and drop it. +*/ -enum PvPTrinketTriggeredSpells +enum BreakShieldSpells { - SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER = 72752, - SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF = 72757, + SPELL_BREAK_SHIELD_DAMAGE_2K = 62626, + SPELL_BREAK_SHIELD_DAMAGE_10K = 64590, + + SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS = 62575, // Also on ToC5 mounts + SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE = 64595, + SPELL_BREAK_SHIELD_TRIGGER_UNK = 66480 }; -class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader +class spell_gen_break_shield: public SpellScriptLoader { public: - spell_pvp_trinket_wotf_shared_cd() : SpellScriptLoader("spell_pvp_trinket_wotf_shared_cd") {} + spell_gen_break_shield(const char* name) : SpellScriptLoader(name) { } - class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript + class spell_gen_break_shield_SpellScript : public SpellScript { - PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript); + PrepareSpellScript(spell_gen_break_shield_SpellScript) - bool Load() OVERRIDE + void HandleScriptEffect(SpellEffIndex effIndex) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + Unit* target = GetHitUnit(); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF)) - return false; - return true; - } + switch (effIndex) + { + case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) + { + uint32 spellId; - void HandleScript() - { - // This is only needed because spells cast from spell_linked_spell are triggered by default - // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD - GetCaster()->ToPlayer()->AddSpellAndCategoryCooldowns(GetSpellInfo(), GetCastItem() ? GetCastItem()->GetEntry() : 0, GetSpell()); + switch (GetSpellInfo()->Id) + { + case SPELL_BREAK_SHIELD_TRIGGER_UNK: + case SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE: + spellId = SPELL_BREAK_SHIELD_DAMAGE_10K; + break; + case SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS: + spellId = SPELL_BREAK_SHIELD_DAMAGE_2K; + break; + default: + return; + } + + if (Unit* rider = GetCaster()->GetCharmer()) + rider->CastSpell(target, spellId, false); + else + GetCaster()->CastSpell(target, spellId, false); + break; + } + case EFFECT_1: // On damaging spells, for removing a defend layer + { + Unit::AuraApplicationMap const& auras = target->GetAppliedAuras(); + for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) + { + if (Aura* aura = itr->second->GetBase()) + { + SpellInfo const* auraInfo = aura->GetSpellInfo(); + if (auraInfo && auraInfo->SpellIconID == 2007 && aura->HasEffectType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)) + { + aura->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL); + // Remove dummys from rider (Necessary for updating visual shields) + if (Unit* rider = target->GetCharmer()) + if (Aura* defend = rider->GetAura(aura->GetId())) + defend->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL); + break; + } + } + } + break; + } + default: + break; + } } void Register() OVERRIDE { - AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript); + OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_pvp_trinket_wotf_shared_cd_SpellScript(); + return new spell_gen_break_shield_SpellScript(); } }; -enum AnimalBloodPoolSpell -{ - SPELL_ANIMAL_BLOOD = 46221, - SPELL_SPAWN_BLOOD_POOL = 63471, -}; - -class spell_gen_animal_blood : public SpellScriptLoader +// 46394 Brutallus Burn +class spell_gen_burn_brutallus : public SpellScriptLoader { public: - spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { } + spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { } - class spell_gen_animal_blood_AuraScript : public AuraScript + class spell_gen_burn_brutallus_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_animal_blood_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL)) - return false; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // Remove all auras with spell id 46221, except the one currently being applied - while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, 0, 0, 0, GetAura())) - GetUnitOwner()->RemoveOwnedAura(aur); - } + PrepareAuraScript(spell_gen_burn_brutallus_AuraScript); - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleEffectPeriodicUpdate(AuraEffect* aurEff) { - if (Unit* owner = GetUnitOwner()) - if (owner->IsInWater()) - owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true); + if (aurEff->GetTickNumber() % 11 == 0) + aurEff->SetAmount(aurEff->GetAmount() * 2); } void Register() OVERRIDE { - AfterEffectApply += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_animal_blood_AuraScript(); + return new spell_gen_burn_brutallus_AuraScript(); } }; -enum DivineStormSpell +enum CannibalizeSpells { - SPELL_DIVINE_STORM = 53385, + SPELL_CANNIBALIZE_TRIGGERED = 20578 }; -// 70769 Divine Storm! -class spell_gen_divine_storm_cd_reset : public SpellScriptLoader +class spell_gen_cannibalize : public SpellScriptLoader { public: - spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") {} + spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { } - class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript + class spell_gen_cannibalize_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript); - - bool Load() OVERRIDE - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + PrepareSpellScript(spell_gen_cannibalize_SpellScript); bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM)) + if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED)) return false; return true; } - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (caster->HasSpellCooldown(SPELL_DIVINE_STORM)) - caster->RemoveSpellCooldown(SPELL_DIVINE_STORM, true); - } - - void Register() OVERRIDE - { - OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_divine_storm_cd_reset_SpellScript(); - } -}; - -class spell_gen_gunship_portal : public SpellScriptLoader -{ - public: - spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } - - class spell_gen_gunship_portal_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_gunship_portal_SpellScript); - - bool Load() OVERRIDE + SpellCastResult CheckIfCorpseNear() { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; + Unit* caster = GetCaster(); + float max_range = GetSpellInfo()->GetMaxRange(false); + WorldObject* result = NULL; + // search for nearby enemy corpse in range + Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY); + Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check); + caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); + if (!result) + return SPELL_FAILED_NO_EDIBLE_CORPSES; + return SPELL_CAST_OK; } - void HandleScript(SpellEffIndex /*effIndex*/) + void HandleDummy(SpellEffIndex /*effIndex*/) { - Player* caster = GetCaster()->ToPlayer(); - if (Battleground* bg = caster->GetBattleground()) - if (bg->GetTypeID(true) == BATTLEGROUND_IC) - bg->DoAction(1, caster->GetGUID()); + GetCaster()->CastSpell(GetCaster(), SPELL_CANNIBALIZE_TRIGGERED, false); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_gunship_portal_SpellScript(); + return new spell_gen_cannibalize_SpellScript(); } }; -enum parachuteIC -{ - SPELL_PARACHUTE_IC = 66657, -}; - -class spell_gen_parachute_ic : public SpellScriptLoader +enum ChaosBlast { - public: - spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } - - class spell_gen_parachute_ic_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_parachute_ic_AuraScript) - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Player* target = GetTarget()->ToPlayer()) - if (target->m_movementInfo.fallTime > 2000) - target->CastSpell(target, SPELL_PARACHUTE_IC, true); - } - - void Register() OVERRIDE - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_gen_parachute_ic_AuraScript(); - } + SPELL_CHAOS_BLAST = 37675 }; -class spell_gen_dungeon_credit : public SpellScriptLoader +class spell_gen_chaos_blast : public SpellScriptLoader { public: - spell_gen_dungeon_credit() : SpellScriptLoader("spell_gen_dungeon_credit") { } + spell_gen_chaos_blast() : SpellScriptLoader("spell_gen_chaos_blast") { } - class spell_gen_dungeon_credit_SpellScript : public SpellScript + class spell_gen_chaos_blast_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_dungeon_credit_SpellScript); + PrepareSpellScript(spell_gen_chaos_blast_SpellScript) - bool Load() OVERRIDE + bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE { - _handled = false; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST)) + return false; + return true; } - - void CreditEncounter() + void HandleDummy(SpellEffIndex /* effIndex */) { - // This hook is executed for every target, make sure we only credit instance once - if (_handled) - return; - - _handled = true; + int32 basepoints0 = 100; Unit* caster = GetCaster(); - if (InstanceScript* instance = caster->GetInstanceScript()) - instance->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, GetSpellInfo()->Id, caster); - } - - void Register() OVERRIDE - { - AfterHit += SpellHitFn(spell_gen_dungeon_credit_SpellScript::CreditEncounter); - } - - bool _handled; - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_dungeon_credit_SpellScript(); - } -}; - -class spell_gen_profession_research : public SpellScriptLoader -{ - public: - spell_gen_profession_research() : SpellScriptLoader("spell_gen_profession_research") {} - - class spell_gen_profession_research_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_profession_research_SpellScript); - - bool Load() OVERRIDE - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - SpellCastResult CheckRequirement() - { - if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - uint32 spellId = GetSpellInfo()->Id; - - // learn random explicit discovery recipe (if any) - if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) - caster->learnSpell(discoveredSpellId, false); - - caster->UpdateCraftSkill(spellId); + if (Unit* target = GetHitUnit()) + caster->CastCustomSpell(target, SPELL_CHAOS_BLAST, &basepoints0, NULL, NULL, true); } void Register() OVERRIDE { - OnCheckCast += SpellCheckCastFn(spell_gen_profession_research_SpellScript::CheckRequirement); - OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_profession_research_SpellScript(); + return new spell_gen_chaos_blast_SpellScript(); } }; -class spell_generic_clone : public SpellScriptLoader +class spell_gen_clone : public SpellScriptLoader { public: - spell_generic_clone() : SpellScriptLoader("spell_generic_clone") { } + spell_gen_clone() : SpellScriptLoader("spell_gen_clone") { } - class spell_generic_clone_SpellScript : public SpellScript + class spell_gen_clone_SpellScript : public SpellScript { - PrepareSpellScript(spell_generic_clone_SpellScript); + PrepareSpellScript(spell_gen_clone_SpellScript); void HandleScriptEffect(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - uint32 spellId = uint32(GetSpellInfo()->Effects[effIndex].CalcValue()); - GetHitUnit()->CastSpell(GetCaster(), spellId, true); + GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_generic_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_generic_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_generic_clone_SpellScript(); + return new spell_gen_clone_SpellScript(); } }; @@ -1134,14 +738,14 @@ enum CloneWeaponSpells SPELL_COPY_RANGED_AURA = 57594 }; -class spell_generic_clone_weapon : public SpellScriptLoader +class spell_gen_clone_weapon : public SpellScriptLoader { public: - spell_generic_clone_weapon() : SpellScriptLoader("spell_generic_clone_weapon") { } + spell_gen_clone_weapon() : SpellScriptLoader("spell_gen_clone_weapon") { } - class spell_generic_clone_weapon_SpellScript : public SpellScript + class spell_gen_clone_weapon_SpellScript : public SpellScript { - PrepareSpellScript(spell_generic_clone_weapon_SpellScript); + PrepareSpellScript(spell_gen_clone_weapon_SpellScript); void HandleScriptEffect(SpellEffIndex effIndex) { @@ -1149,22 +753,18 @@ class spell_generic_clone_weapon : public SpellScriptLoader Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) - { - - uint32 spellId = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - caster->CastSpell(target, spellId, true); - } + caster->CastSpell(target, GetEffectValue(), true); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_generic_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_generic_clone_weapon_SpellScript(); + return new spell_gen_clone_weapon_SpellScript(); } }; @@ -1181,8 +781,12 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_3_AURA) - || !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_2_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_RANGED_AURA)) + if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) || + !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) || + !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_3_AURA) || + !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_AURA) || + !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_2_AURA) || + !sSpellMgr->GetSpellInfo(SPELL_COPY_RANGED_AURA)) return false; return true; } @@ -1191,7 +795,6 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader { Unit* caster = GetCaster(); Unit* target = GetTarget(); - if (!caster) return; @@ -1253,21 +856,15 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader case SPELL_COPY_WEAPON_AURA: case SPELL_COPY_WEAPON_2_AURA: case SPELL_COPY_WEAPON_3_AURA: - { target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem); break; - } case SPELL_COPY_OFFHAND_AURA: case SPELL_COPY_OFFHAND_2_AURA: - { target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem); break; - } case SPELL_COPY_RANGED_AURA: - { target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem); break; - } default: break; } @@ -1287,430 +884,489 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader } }; -enum SeaforiumSpells -{ - SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT = 60937, -}; - -class spell_gen_seaforium_blast : public SpellScriptLoader +class spell_gen_count_pct_from_max_hp : public SpellScriptLoader { public: - spell_gen_seaforium_blast() : SpellScriptLoader("spell_gen_seaforium_blast") {} + spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { } - class spell_gen_seaforium_blast_SpellScript : public SpellScript + class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_seaforium_blast_SpellScript); + PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) - bool Validate(SpellInfo const* /*spell*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT)) - return false; - return true; - } + public: + spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } - bool Load() OVERRIDE + void RecalculateDamage() { - // OriginalCaster is always available in Spell::prepare - return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; - } + if (!_damagePct) + _damagePct = GetHitDamage(); - void AchievementCredit(SpellEffIndex /*effIndex*/) - { - // but in effect handling OriginalCaster can become NULL - if (Unit* originalCaster = GetOriginalCaster()) - if (GameObject* go = GetHitGObj()) - if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) - originalCaster->CastSpell(originalCaster, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true); + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct)); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); + OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage); } + + private: + int32 _damagePct; }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_seaforium_blast_SpellScript(); + return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct); } + + private: + int32 _damagePct; }; -enum FriendOrFowl +// 63845 - Create Lance +enum CreateLanceSpells { - SPELL_TURKEY_VENGEANCE = 25285, + SPELL_CREATE_LANCE_ALLIANCE = 63914, + SPELL_CREATE_LANCE_HORDE = 63919 }; -class spell_gen_turkey_marker : public SpellScriptLoader +class spell_gen_create_lance : public SpellScriptLoader { public: - spell_gen_turkey_marker() : SpellScriptLoader("spell_gen_turkey_marker") { } + spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { } - class spell_gen_turkey_marker_AuraScript : public AuraScript + class spell_gen_create_lance_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_turkey_marker_AuraScript); + PrepareSpellScript(spell_gen_create_lance_SpellScript); - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - // store stack apply times, so we can pop them while they expire - _applyTimes.push_back(getMSTime()); - Unit* target = GetTarget(); - - // on stack 15 cast the achievement crediting spell - if (GetStackAmount() >= 15) - target->CastSpell(target, SPELL_TURKEY_VENGEANCE, true, NULL, aurEff, GetCasterGUID()); + if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || + !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE)) + return false; + return true; } - void OnPeriodic(AuraEffect const* /*aurEff*/) + void HandleScript(SpellEffIndex effIndex) { - if (_applyTimes.empty()) - return; + PreventHitDefaultEffect(effIndex); - // pop stack if it expired for us - if (_applyTimes.front() + GetMaxDuration() < getMSTime()) - ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); + if (Player* target = GetHitPlayer()) + { + if (target->GetTeam() == ALLIANCE) + GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true); + else + GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true); + } } void Register() OVERRIDE { - AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } - - std::list<uint32> _applyTimes; }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_turkey_marker_AuraScript(); + return new spell_gen_create_lance_SpellScript(); } }; -class spell_gen_lifeblood : public SpellScriptLoader +class spell_gen_creature_permanent_feign_death : public SpellScriptLoader { public: - spell_gen_lifeblood() : SpellScriptLoader("spell_gen_lifeblood") { } + spell_gen_creature_permanent_feign_death() : SpellScriptLoader("spell_gen_creature_permanent_feign_death") { } - class spell_gen_lifeblood_AuraScript : public AuraScript + class spell_gen_creature_permanent_feign_death_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_lifeblood_AuraScript); + PrepareAuraScript(spell_gen_creature_permanent_feign_death_AuraScript); - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (Unit* owner = GetUnitOwner()) - amount += int32(CalculatePct(owner->GetMaxHealth(), 1.5f / aurEff->GetTotalTicks())); + Unit* target = GetTarget(); + target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->SetReactState(REACT_PASSIVE); } void Register() OVERRIDE { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_lifeblood_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_lifeblood_AuraScript(); + return new spell_gen_creature_permanent_feign_death_AuraScript(); } }; -enum MagicRoosterSpells +enum DalaranDisguiseSpells { - SPELL_MAGIC_ROOSTER_NORMAL = 66122, - SPELL_MAGIC_ROOSTER_DRAENEI_MALE = 66123, - SPELL_MAGIC_ROOSTER_TAUREN_MALE = 66124, + SPELL_SUNREAVER_DISGUISE_TRIGGER = 69672, + SPELL_SUNREAVER_DISGUISE_FEMALE = 70973, + SPELL_SUNREAVER_DISGUISE_MALE = 70974, + + SPELL_SILVER_COVENANT_DISGUISE_TRIGGER = 69673, + SPELL_SILVER_COVENANT_DISGUISE_FEMALE = 70971, + SPELL_SILVER_COVENANT_DISGUISE_MALE = 70972 }; -class spell_gen_magic_rooster : public SpellScriptLoader +class spell_gen_dalaran_disguise : public SpellScriptLoader { public: - spell_gen_magic_rooster() : SpellScriptLoader("spell_gen_magic_rooster") { } + spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) { } - class spell_gen_magic_rooster_SpellScript : public SpellScript + class spell_gen_dalaran_disguise_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_magic_rooster_SpellScript); + PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript); + bool Validate(SpellInfo const* spellEntry) OVERRIDE + { + switch (spellEntry->Id) + { + case SPELL_SUNREAVER_DISGUISE_TRIGGER: + if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) || + !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE)) + return false; + break; + case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: + if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || + !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE)) + return false; + break; + } + return true; + } - void HandleScript(SpellEffIndex effIndex) + void HandleScript(SpellEffIndex /*effIndex*/) { - PreventHitDefaultEffect(effIndex); - if (Player* target = GetHitPlayer()) + if (Player* player = GetHitPlayer()) { - // prevent client crashes from stacking mounts - target->RemoveAurasByType(SPELL_AURA_MOUNTED); + uint8 gender = player->getGender(); - uint32 spellId = SPELL_MAGIC_ROOSTER_NORMAL; - switch (target->getRace()) + uint32 spellId = GetSpellInfo()->Id; + + switch (spellId) { - case RACE_DRAENEI: - if (target->getGender() == GENDER_MALE) - spellId = SPELL_MAGIC_ROOSTER_DRAENEI_MALE; + case SPELL_SUNREAVER_DISGUISE_TRIGGER: + spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE; break; - case RACE_TAUREN: - if (target->getGender() == GENDER_MALE) - spellId = SPELL_MAGIC_ROOSTER_TAUREN_MALE; + case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: + spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE; break; default: break; } - target->CastSpell(target, spellId, true); + GetCaster()->CastSpell(player, spellId, true); } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_magic_rooster_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_magic_rooster_SpellScript(); + return new spell_gen_dalaran_disguise_SpellScript(); } }; -class spell_gen_allow_cast_from_item_only : public SpellScriptLoader +enum DamageReductionAura +{ + SPELL_BLESSING_OF_SANCTUARY = 20911, + SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, + SPELL_RENEWED_HOPE = 63944, + SPELL_VIGILANCE = 50720, + SPELL_DAMAGE_REDUCTION_AURA = 68066 +}; + +class spell_gen_damage_reduction_aura : public SpellScriptLoader { public: - spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } + spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } - class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript + class spell_gen_damage_reduction_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); + PrepareAuraScript(spell_gen_damage_reduction_AuraScript); - SpellCastResult CheckRequirement() + bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE { - if (!GetCastItem()) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - return SPELL_CAST_OK; + if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) + return false; + return true; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_RENEWED_HOPE) || + target->HasAura(SPELL_VIGILANCE))) + { + target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); + } } void Register() OVERRIDE { - OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); + OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } + }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_allow_cast_from_item_only_SpellScript(); + return new spell_gen_damage_reduction_AuraScript(); } }; -enum Launch +enum DefendVisuals { - SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 + SPELL_VISUAL_SHIELD_1 = 63130, + SPELL_VISUAL_SHIELD_2 = 63131, + SPELL_VISUAL_SHIELD_3 = 63132 }; -class spell_gen_launch : public SpellScriptLoader +class spell_gen_defend : public SpellScriptLoader { public: - spell_gen_launch() : SpellScriptLoader("spell_gen_launch") {} + spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { } - class spell_gen_launch_SpellScript : public SpellScript + class spell_gen_defend_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_launch_SpellScript); + PrepareAuraScript(spell_gen_defend_AuraScript); - void HandleScript(SpellEffIndex /*effIndex*/) + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - if (Player* player = GetHitPlayer()) - player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) + return false; + return true; } - void Launch() + void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - WorldLocation const* const position = GetExplTargetDest(); - - if (Player* player = GetHitPlayer()) + if (GetCaster()) { - player->ExitVehicle(); - - // A better research is needed - // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds + Unit* target = GetTarget(); - float speedZ = 10.0f; - float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); - float speedXY = dist; + for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) + target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); - player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); + target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff); } + else + GetTarget()->RemoveAurasDueToSpell(GetId()); + } + + void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) + GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); + } + + void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (TempSummon* vehicle = caster->ToTempSummon()) + if (Unit* rider = vehicle->GetSummoner()) + rider->RemoveAurasDueToSpell(GetId()); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); - AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); + SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); + + // Defend spells casted by NPCs (add visuals) + if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + + // Remove Defend spell from player when he dismounts + if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + + // Defend spells casted by players (add/remove visuals) + if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_launch_SpellScript(); + return new spell_gen_defend_AuraScript(); } }; -enum VehicleScaling -{ - SPELL_GEAR_SCALING = 66668, -}; - -class spell_gen_vehicle_scaling : public SpellScriptLoader +class spell_gen_despawn_self : public SpellScriptLoader { public: - spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } + spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { } - class spell_gen_vehicle_scaling_AuraScript : public AuraScript + class spell_gen_despawn_self_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); + PrepareSpellScript(spell_gen_despawn_self_SpellScript); bool Load() OVERRIDE { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + return GetCaster()->GetTypeId() == TYPEID_UNIT; } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + void HandleDummy(SpellEffIndex effIndex) { - Unit* caster = GetCaster(); - float factor; - uint16 baseItemLevel; - - /// @todo Reserach coeffs for different vehicles - switch (GetId()) - { - case SPELL_GEAR_SCALING: - factor = 1.0f; - baseItemLevel = 205; - break; - default: - factor = 1.0f; - baseItemLevel = 170; - break; - } - - float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); - if (avgILvl < baseItemLevel) - return; /// @todo Research possibility of scaling down - - amount = uint16((avgILvl - baseItemLevel) * factor); + if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) + GetCaster()->ToCreature()->DespawnOrUnsummon(); } void Register() OVERRIDE { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); + OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_vehicle_scaling_AuraScript(); + return new spell_gen_despawn_self_SpellScript(); } }; +enum DivineStormSpell +{ + SPELL_DIVINE_STORM = 53385, +}; -class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader +// 70769 Divine Storm! +class spell_gen_divine_storm_cd_reset : public SpellScriptLoader { public: - spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { } + spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") { } - class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript + class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript); + PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript); bool Load() OVERRIDE { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - void HandleDummy(SpellEffIndex effIndex) + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - Player* player = GetCaster()->ToPlayer(); - uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); - int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - - FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); - - if (!factionEntry) - return; - - // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated) - // Not when player already has equal or higher rep with this faction - if (player->GetReputationMgr().GetBaseReputation(factionEntry) < repChange) - player->GetReputationMgr().SetReputation(factionEntry, repChange); + if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM)) + return false; + return true; + } - // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (caster->HasSpellCooldown(SPELL_DIVINE_STORM)) + caster->RemoveSpellCooldown(SPELL_DIVINE_STORM, true); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_oracle_wolvar_reputation_SpellScript(); + return new spell_gen_divine_storm_cd_reset_SpellScript(); } }; -enum DamageReductionAura -{ - SPELL_BLESSING_OF_SANCTUARY = 20911, - SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, - SPELL_RENEWED_HOPE = 63944, - SPELL_VIGILANCE = 50720, - SPELL_DAMAGE_REDUCTION_AURA = 68066, -}; - -class spell_gen_damage_reduction_aura : public SpellScriptLoader +class spell_gen_dream_funnel: public SpellScriptLoader { public: - spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } + spell_gen_dream_funnel() : SpellScriptLoader("spell_gen_dream_funnel") { } - class spell_gen_damage_reduction_AuraScript : public AuraScript + class spell_gen_dream_funnel_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_damage_reduction_AuraScript); + PrepareAuraScript(spell_gen_dream_funnel_AuraScript); - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) - return false; - return true; + if (GetCaster()) + amount = GetCaster()->GetMaxHealth() * 0.05f; + + canBeRecalculated = false; } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void Register() OVERRIDE { - Unit* target = GetTarget(); - target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); } + }; - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_gen_dream_funnel_AuraScript(); + } +}; + +class spell_gen_ds_flush_knockback : public SpellScriptLoader +{ + public: + spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") { } + + class spell_gen_ds_flush_knockback_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_RENEWED_HOPE) || - target->HasAura(SPELL_VIGILANCE))) - target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); + // Here the target is the water spout and determines the position where the player is knocked from + if (Unit* target = GetHitUnit()) + { + if (Player* player = GetCaster()->ToPlayer()) + { + float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target)); + float verticalSpeed = 8.0f; + // This method relies on the Dalaran Sewer map disposition and Water Spout position + // What we do is knock the player from a position exactly behind him and at the end of the pipe + player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); + } + } } void Register() OVERRIDE { - OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); } - }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_damage_reduction_AuraScript(); + return new spell_gen_ds_flush_knockback_SpellScript(); } }; enum DummyTrigger { SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470, - SPELL_PERSISTANT_SHIELD = 26467, + SPELL_PERSISTANT_SHIELD = 26467 }; class spell_gen_dummy_trigger : public SpellScriptLoader @@ -1724,7 +1380,8 @@ class spell_gen_dummy_trigger : public SpellScriptLoader bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD)) + if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || + !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD)) return false; return true; } @@ -1749,43 +1406,119 @@ class spell_gen_dummy_trigger : public SpellScriptLoader { return new spell_gen_dummy_trigger_SpellScript(); } - }; -class spell_gen_spirit_healer_res : public SpellScriptLoader +class spell_gen_dungeon_credit : public SpellScriptLoader { public: - spell_gen_spirit_healer_res(): SpellScriptLoader("spell_gen_spirit_healer_res") { } + spell_gen_dungeon_credit() : SpellScriptLoader("spell_gen_dungeon_credit") { } - class spell_gen_spirit_healer_res_SpellScript : public SpellScript + class spell_gen_dungeon_credit_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_spirit_healer_res_SpellScript); + PrepareSpellScript(spell_gen_dungeon_credit_SpellScript); bool Load() OVERRIDE { - return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; + _handled = false; + return GetCaster()->GetTypeId() == TYPEID_UNIT; } - void HandleDummy(SpellEffIndex /* effIndex */) + void CreditEncounter() { - Player* originalCaster = GetOriginalCaster()->ToPlayer(); - if (Unit* target = GetHitUnit()) + // This hook is executed for every target, make sure we only credit instance once + if (_handled) + return; + + _handled = true; + Unit* caster = GetCaster(); + if (InstanceScript* instance = caster->GetInstanceScript()) + instance->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, GetSpellInfo()->Id, caster); + } + + void Register() OVERRIDE + { + AfterHit += SpellHitFn(spell_gen_dungeon_credit_SpellScript::CreditEncounter); + } + + private: + bool _handled; + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_gen_dungeon_credit_SpellScript(); + } +}; + +enum EluneCandle +{ + // Creatures + NPC_OMEN = 15467, + + // Spells + SPELL_ELUNE_CANDLE_OMEN_HEAD = 26622, + SPELL_ELUNE_CANDLE_OMEN_CHEST = 26624, + SPELL_ELUNE_CANDLE_OMEN_HAND_R = 26625, + SPELL_ELUNE_CANDLE_OMEN_HAND_L = 26649, + SPELL_ELUNE_CANDLE_NORMAL = 26636 +}; + +class spell_gen_elune_candle : public SpellScriptLoader +{ + public: + spell_gen_elune_candle() : SpellScriptLoader("spell_gen_elune_candle") { } + + class spell_gen_elune_candle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_elune_candle_SpellScript); + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) || + !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST) || + !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_R) || + !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_L) || + !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_NORMAL)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + uint32 spellId = 0; + + if (GetHitUnit()->GetEntry() == NPC_OMEN) { - WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); - data << uint64(target->GetGUID()); - originalCaster->GetSession()->SendPacket(&data); + switch (urand(0, 3)) + { + case 0: + spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD; + break; + case 1: + spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST; + break; + case 2: + spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R; + break; + case 3: + spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L; + break; + } } + else + spellId = SPELL_ELUNE_CANDLE_NORMAL; + + GetCaster()->CastSpell(GetHitUnit(), spellId, true, NULL); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_spirit_healer_res_SpellScript(); + return new spell_gen_elune_candle_SpellScript(); } }; @@ -1793,7 +1526,7 @@ enum TransporterBackfires { SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH = 23444, SPELL_TRANSPORTER_EVIL_TWIN = 23445, - SPELL_TRANSPORTER_MALFUNCTION_MISS = 36902, + SPELL_TRANSPORTER_MALFUNCTION_MISS = 36902 }; class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader @@ -1807,8 +1540,9 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) - || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_MISS)) + if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) || + !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) || + !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_MISS)) return false; return true; } @@ -1837,10 +1571,63 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader } }; + +class spell_gen_gift_of_naaru : public SpellScriptLoader +{ + public: + spell_gen_gift_of_naaru() : SpellScriptLoader("spell_gen_gift_of_naaru") { } + + class spell_gen_gift_of_naaru_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_gift_of_naaru_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (!GetCaster()) + return; + + float heal = 0.0f; + switch (GetSpellInfo()->SpellFamilyName) + { + case SPELLFAMILY_MAGE: + case SPELLFAMILY_WARLOCK: + case SPELLFAMILY_PRIEST: + heal = 1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())); + break; + case SPELLFAMILY_PALADIN: + case SPELLFAMILY_SHAMAN: + heal = std::max(1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())), 1.1f * float(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK))); + break; + case SPELLFAMILY_WARRIOR: + case SPELLFAMILY_HUNTER: + case SPELLFAMILY_DEATHKNIGHT: + heal = 1.1f * float(std::max(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetCaster()->GetTotalAttackPowerValue(RANGED_ATTACK))); + break; + case SPELLFAMILY_GENERIC: + default: + break; + } + + int32 healTick = floor(heal / aurEff->GetTotalTicks()); + amount += int32(std::max(healTick, 0)); + } + + void Register() OVERRIDE + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_gen_gift_of_naaru_AuraScript(); + } +}; + enum GnomishTransporter { SPELL_TRANSPORTER_SUCCESS = 23441, - SPELL_TRANSPORTER_FAILURE = 23446, + SPELL_TRANSPORTER_FAILURE = 23446 }; class spell_gen_gnomish_transporter : public SpellScriptLoader @@ -1854,15 +1641,15 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE)) + if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) || + !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE)) return false; return true; } void HandleDummy(SpellEffIndex /* effIndex */) { - Unit* caster = GetCaster(); - caster->CastSpell(caster, roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true); + GetCaster()->CastSpell(GetCaster(), roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true); } void Register() OVERRIDE @@ -1877,183 +1664,401 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader } }; -enum DalaranDisguiseSpells +class spell_gen_gunship_portal : public SpellScriptLoader { - SPELL_SUNREAVER_DISGUISE_TRIGGER = 69672, - SPELL_SUNREAVER_DISGUISE_FEMALE = 70973, - SPELL_SUNREAVER_DISGUISE_MALE = 70974, + public: + spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } - SPELL_SILVER_COVENANT_DISGUISE_TRIGGER = 69673, - SPELL_SILVER_COVENANT_DISGUISE_FEMALE = 70971, - SPELL_SILVER_COVENANT_DISGUISE_MALE = 70972, + class spell_gen_gunship_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_gunship_portal_SpellScript); + + bool Load() OVERRIDE + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (Battleground* bg = caster->GetBattleground()) + if (bg->GetTypeID(true) == BATTLEGROUND_IC) + bg->DoAction(1, caster->GetGUID()); + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_gen_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_gen_gunship_portal_SpellScript(); + } }; -class spell_gen_dalaran_disguise : public SpellScriptLoader +enum Launch +{ + SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 +}; + +class spell_gen_launch : public SpellScriptLoader { public: - spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) {} + spell_gen_launch() : SpellScriptLoader("spell_gen_launch") { } - class spell_gen_dalaran_disguise_SpellScript : public SpellScript + class spell_gen_launch_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript); - bool Validate(SpellInfo const* spellEntry) OVERRIDE + PrepareSpellScript(spell_gen_launch_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - switch (spellEntry->Id) + if (Player* player = GetHitPlayer()) + player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage + } + + void Launch() + { + WorldLocation const* const position = GetExplTargetDest(); + + if (Player* player = GetHitPlayer()) { - case SPELL_SUNREAVER_DISGUISE_TRIGGER: - if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) || !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE)) - return false; - break; - case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: - if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE)) - return false; - break; + player->ExitVehicle(); + + // A better research is needed + // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds + + float speedZ = 10.0f; + float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); + float speedXY = dist; + + player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); } + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_gen_launch_SpellScript(); + } +}; + + +class spell_gen_lifeblood : public SpellScriptLoader +{ + public: + spell_gen_lifeblood() : SpellScriptLoader("spell_gen_lifeblood") { } + + class spell_gen_lifeblood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_lifeblood_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()) + amount += int32(CalculatePct(owner->GetMaxHealth(), 1.5f / aurEff->GetTotalTicks())); + } + + void Register() OVERRIDE + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_lifeblood_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_gen_lifeblood_AuraScript(); + } +}; + +enum GenericLifebloom +{ + SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL = 43422, + SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL = 52552, + SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL = 53692, + SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL = 57763, + SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL = 66094 +}; + +class spell_gen_lifebloom : public SpellScriptLoader +{ + public: + spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + + class spell_gen_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_lifebloom_AuraScript); + + public: + spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(_spellId)) + return false; return true; } - void HandleScript(SpellEffIndex /*effIndex*/) + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - if (Player* player = GetHitPlayer()) - { - uint8 gender = player->getGender(); + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) + return; - uint32 spellId = GetSpellInfo()->Id; + // final heal + GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID()); + } - switch (spellId) + void Register() OVERRIDE + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + } + + private: + uint32 _spellId; + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_gen_lifebloom_AuraScript(_spellId); + } + + private: + uint32 _spellId; +}; + +enum MagicRoosterSpells +{ + SPELL_MAGIC_ROOSTER_NORMAL = 66122, + SPELL_MAGIC_ROOSTER_DRAENEI_MALE = 66123, + SPELL_MAGIC_ROOSTER_TAUREN_MALE = 66124 +}; + +class spell_gen_magic_rooster : public SpellScriptLoader +{ + public: + spell_gen_magic_rooster() : SpellScriptLoader("spell_gen_magic_rooster") { } + + class spell_gen_magic_rooster_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_magic_rooster_SpellScript); + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Player* target = GetHitPlayer()) + { + // prevent client crashes from stacking mounts + target->RemoveAurasByType(SPELL_AURA_MOUNTED); + + uint32 spellId = SPELL_MAGIC_ROOSTER_NORMAL; + switch (target->getRace()) { - case SPELL_SUNREAVER_DISGUISE_TRIGGER: - spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE; + case RACE_DRAENEI: + if (target->getGender() == GENDER_MALE) + spellId = SPELL_MAGIC_ROOSTER_DRAENEI_MALE; break; - case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: - spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE; + case RACE_TAUREN: + if (target->getGender() == GENDER_MALE) + spellId = SPELL_MAGIC_ROOSTER_TAUREN_MALE; break; default: break; } - GetCaster()->CastSpell(player, spellId, true); + + target->CastSpell(target, spellId, true); } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_magic_rooster_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_dalaran_disguise_SpellScript(); + return new spell_gen_magic_rooster_SpellScript(); } }; -/* DOCUMENTATION: Break-Shield spells - Break-Shield spells can be classified in three groups: +enum Mounts +{ + SPELL_COLD_WEATHER_FLYING = 54197, - - Spells on vehicle bar used by players: - + EFFECT_0: SCRIPT_EFFECT - + EFFECT_1: NONE - + EFFECT_2: NONE - - Spells casted by players triggered by script: - + EFFECT_0: SCHOOL_DAMAGE - + EFFECT_1: SCRIPT_EFFECT - + EFFECT_2: FORCE_CAST - - Spells casted by NPCs on players: - + EFFECT_0: SCHOOL_DAMAGE - + EFFECT_1: SCRIPT_EFFECT - + EFFECT_2: NONE + // Magic Broom + SPELL_MAGIC_BROOM_60 = 42680, + SPELL_MAGIC_BROOM_100 = 42683, + SPELL_MAGIC_BROOM_150 = 42667, + SPELL_MAGIC_BROOM_280 = 42668, - In the following script we handle the SCRIPT_EFFECT for effIndex EFFECT_0 and EFFECT_1. - - When handling EFFECT_0 we're in the "Spells on vehicle bar used by players" case - and we'll trigger "Spells casted by players triggered by script" - - When handling EFFECT_1 we're in the "Spells casted by players triggered by script" - or "Spells casted by NPCs on players" so we'll search for the first defend layer and drop it. -*/ + // Headless Horseman's Mount + SPELL_HEADLESS_HORSEMAN_MOUNT_60 = 51621, + SPELL_HEADLESS_HORSEMAN_MOUNT_100 = 48024, + SPELL_HEADLESS_HORSEMAN_MOUNT_150 = 51617, + SPELL_HEADLESS_HORSEMAN_MOUNT_280 = 48023, -enum BreakShieldSpells -{ - SPELL_BREAK_SHIELD_DAMAGE_2K = 62626, - SPELL_BREAK_SHIELD_DAMAGE_10K = 64590, + // Winged Steed of the Ebon Blade + SPELL_WINGED_STEED_150 = 54726, + SPELL_WINGED_STEED_280 = 54727, - SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS = 62575, // Also on ToC5 mounts - SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE = 64595, - SPELL_BREAK_SHIELD_TRIGGER_UNK = 66480, + // Big Love Rocket + SPELL_BIG_LOVE_ROCKET_0 = 71343, + SPELL_BIG_LOVE_ROCKET_60 = 71344, + SPELL_BIG_LOVE_ROCKET_100 = 71345, + SPELL_BIG_LOVE_ROCKET_150 = 71346, + SPELL_BIG_LOVE_ROCKET_310 = 71347, + + // Invincible + SPELL_INVINCIBLE_60 = 72281, + SPELL_INVINCIBLE_100 = 72282, + SPELL_INVINCIBLE_150 = 72283, + SPELL_INVINCIBLE_310 = 72284, + + // Blazing Hippogryph + SPELL_BLAZING_HIPPOGRYPH_150 = 74854, + SPELL_BLAZING_HIPPOGRYPH_280 = 74855, + + // Celestial Steed + SPELL_CELESTIAL_STEED_60 = 75619, + SPELL_CELESTIAL_STEED_100 = 75620, + SPELL_CELESTIAL_STEED_150 = 75617, + SPELL_CELESTIAL_STEED_280 = 75618, + SPELL_CELESTIAL_STEED_310 = 76153, + + // X-53 Touring Rocket + SPELL_X53_TOURING_ROCKET_150 = 75957, + SPELL_X53_TOURING_ROCKET_280 = 75972, + SPELL_X53_TOURING_ROCKET_310 = 76154 }; -class spell_gen_break_shield: public SpellScriptLoader +class spell_gen_mount : public SpellScriptLoader { public: - spell_gen_break_shield(const char* name) : SpellScriptLoader(name) {} + spell_gen_mount(const char* name, uint32 mount0 = 0, uint32 mount60 = 0, uint32 mount100 = 0, uint32 mount150 = 0, uint32 mount280 = 0, uint32 mount310 = 0) : SpellScriptLoader(name), + _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } - class spell_gen_break_shield_SpellScript : public SpellScript + class spell_gen_mount_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_break_shield_SpellScript) + PrepareSpellScript(spell_gen_mount_SpellScript); - void HandleScriptEffect(SpellEffIndex effIndex) + public: + spell_gen_mount_SpellScript(uint32 mount0, uint32 mount60, uint32 mount100, uint32 mount150, uint32 mount280, uint32 mount310) : SpellScript(), + _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - Unit* target = GetHitUnit(); + if (_mount0 && !sSpellMgr->GetSpellInfo(_mount0)) + return false; + if (_mount60 && !sSpellMgr->GetSpellInfo(_mount60)) + return false; + if (_mount100 && !sSpellMgr->GetSpellInfo(_mount100)) + return false; + if (_mount150 && !sSpellMgr->GetSpellInfo(_mount150)) + return false; + if (_mount280 && !sSpellMgr->GetSpellInfo(_mount280)) + return false; + if (_mount310 && !sSpellMgr->GetSpellInfo(_mount310)) + return false; + return true; + } - switch (effIndex) + void HandleMount(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (Player* target = GetHitPlayer()) { - case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) - { - uint32 spellId; + // Prevent stacking of mounts and client crashes upon dismounting + target->RemoveAurasByType(SPELL_AURA_MOUNTED, 0, GetHitAura()); - switch (GetSpellInfo()->Id) - { - case SPELL_BREAK_SHIELD_TRIGGER_UNK: - case SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE: - spellId = SPELL_BREAK_SHIELD_DAMAGE_10K; - break; - case SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS: - spellId = SPELL_BREAK_SHIELD_DAMAGE_2K; - break; - default: - return; - } + // Triggered spell id dependent on riding skill and zone + bool canFly = false; + uint32 map = GetVirtualMapForMapAndZone(target->GetMapId(), target->GetZoneId()); + if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING))) + canFly = true; - if (Unit* rider = GetCaster()->GetCharmer()) - rider->CastSpell(target, spellId, false); - else - GetCaster()->CastSpell(target, spellId, false); - break; - } - case EFFECT_1: // On damaging spells, for removing a defend layer + float x, y, z; + target->GetPosition(x, y, z); + uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z); + AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag); + if (!area || (canFly && (area->flags & AREA_FLAG_NO_FLY_ZONE))) + canFly = false; + + uint32 mount = 0; + switch (target->GetBaseSkillValue(SKILL_RIDING)) { - Unit::AuraApplicationMap const& auras = target->GetAppliedAuras(); - for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) - { - if (Aura* aura = itr->second->GetBase()) + case 0: + mount = _mount0; + break; + case 75: + mount = _mount60; + break; + case 150: + mount = _mount100; + break; + case 225: + if (canFly) + mount = _mount150; + else + mount = _mount100; + break; + case 300: + if (canFly) { - SpellInfo const* auraInfo = aura->GetSpellInfo(); - if (auraInfo && auraInfo->SpellIconID == 2007 && aura->HasEffectType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)) - { - aura->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL); - // Remove dummys from rider (Necessary for updating visual shields) - if (Unit* rider = target->GetCharmer()) - if (Aura* defend = rider->GetAura(aura->GetId())) - defend->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL); - break; - } + if (_mount310 && target->Has310Flyer(false)) + mount = _mount310; + else + mount = _mount280; } - } - break; + else + mount = _mount100; + break; + default: + break; + } + + if (mount) + { + PreventHitAura(); + target->CastSpell(target, mount, true); } - default: - break; } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } + + private: + uint32 _mount0; + uint32 _mount60; + uint32 _mount100; + uint32 _mount150; + uint32 _mount280; + uint32 _mount310; }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_break_shield_SpellScript(); + return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310); } + + private: + uint32 _mount0; + uint32 _mount60; + uint32 _mount100; + uint32 _mount150; + uint32 _mount280; + uint32 _mount310; }; /* DOCUMENTATION: Charge spells @@ -2217,285 +2222,290 @@ class spell_gen_mounted_charge: public SpellScriptLoader } }; -enum DefendVisuals +enum Netherbloom { - SPELL_VISUAL_SHIELD_1 = 63130, - SPELL_VISUAL_SHIELD_2 = 63131, - SPELL_VISUAL_SHIELD_3 = 63132, + SPELL_NETHERBLOOM_POLLEN_1 = 28703 }; -class spell_gen_defend : public SpellScriptLoader +// 28702 - Netherbloom +class spell_gen_netherbloom : public SpellScriptLoader { public: - spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { } + spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { } - class spell_gen_defend_AuraScript : public AuraScript + class spell_gen_netherbloom_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_defend_AuraScript); + PrepareSpellScript(spell_gen_netherbloom_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) - return false; + for (uint8 i = 0; i < 5; ++i) + if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i)) + return false; return true; } - void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + void HandleScript(SpellEffIndex effIndex) { - if (GetCaster()) - { - Unit* target = GetTarget(); + PreventHitDefaultEffect(effIndex); - for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) - target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); + if (Unit* target = GetHitUnit()) + { + // 25% chance of casting a random buff + if (roll_chance_i(75)) + return; - target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff); - } - else - GetTarget()->RemoveAurasDueToSpell(GetId()); - } + // triggered spells are 28703 to 28707 + // Note: some sources say, that there was the possibility of + // receiving a debuff. However, this seems to be removed by a patch. - void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) - GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); - } + // don't overwrite an existing aura + for (uint8 i = 0; i < 5; ++i) + if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i)) + return; - void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (TempSummon* vehicle = caster->ToTempSummon()) - if (Unit* rider = vehicle->GetSummoner()) - rider->RemoveAurasDueToSpell(GetId()); + target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true); + } } void Register() OVERRIDE { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); - - // Defend spells casted by NPCs (add visuals) - if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - - // Remove Defend spell from player when he dismounts - if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - - // Defend spells casted by players (add/remove visuals) - if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } + OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_defend_AuraScript(); + return new spell_gen_netherbloom_SpellScript(); } }; -enum MountedDuelSpells +enum NightmareVine { - SPELL_ON_TOURNAMENT_MOUNT = 63034, - SPELL_MOUNTED_DUEL = 62875, + SPELL_NIGHTMARE_POLLEN = 28721 }; -class spell_gen_tournament_duel : public SpellScriptLoader +// 28720 - Nightmare Vine +class spell_gen_nightmare_vine : public SpellScriptLoader { public: - spell_gen_tournament_duel() : SpellScriptLoader("spell_gen_tournament_duel") { } + spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { } - class spell_gen_tournament_duel_SpellScript : public SpellScript + class spell_gen_nightmare_vine_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_tournament_duel_SpellScript); + PrepareSpellScript(spell_gen_nightmare_vine_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL)) + if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN)) return false; return true; } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + void HandleScript(SpellEffIndex effIndex) { - if (Unit* rider = GetCaster()->GetCharmer()) + PreventHitDefaultEffect(effIndex); + + if (Unit* target = GetHitUnit()) { - if (Player* plrTarget = GetHitPlayer()) - { - if (plrTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && plrTarget->GetVehicleBase()) - rider->CastSpell(plrTarget, SPELL_MOUNTED_DUEL, true); - } - else if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT)) - rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true); - } + // 25% chance of casting Nightmare Pollen + if (roll_chance_i(25)) + target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true); } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_tournament_duel_SpellScript(); + return new spell_gen_nightmare_vine_SpellScript(); } }; -enum TournamentMountsSpells +enum ObsidianArmor { - SPELL_LANCE_EQUIPPED = 62853, + SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536, + SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533, + SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538, + SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534, + SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535, + SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540 }; -class spell_gen_summon_tournament_mount : public SpellScriptLoader +// 27539 - Obsidian Armor +class spell_gen_obsidian_armor : public SpellScriptLoader { public: - spell_gen_summon_tournament_mount() : SpellScriptLoader("spell_gen_summon_tournament_mount") { } + spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { } - class spell_gen_summon_tournament_mount_SpellScript : public SpellScript + class spell_gen_obsidian_armor_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript); + PrepareAuraScript(spell_gen_obsidian_armor_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED)) + if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) || + !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) || + !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) || + !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) || + !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) || + !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE)) return false; return true; } - SpellCastResult CheckIfLanceEquiped() + bool CheckProc(ProcEventInfo& eventInfo) { - if (GetCaster()->IsInDisallowedMountForm()) - GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); + if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() + return false; - if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED)) + if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL) + return false; + + return true; + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId = 0; + switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED); - return SPELL_FAILED_CUSTOM_ERROR; + case SPELL_SCHOOL_HOLY: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY; + break; + case SPELL_SCHOOL_FIRE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE; + break; + case SPELL_SCHOOL_NATURE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE; + break; + case SPELL_SCHOOL_FROST: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST; + break; + case SPELL_SCHOOL_SHADOW: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW; + break; + case SPELL_SCHOOL_ARCANE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE; + break; + default: + return; } - - return SPELL_CAST_OK; + GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); } void Register() OVERRIDE { - OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount_SpellScript::CheckIfLanceEquiped); + DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_summon_tournament_mount_SpellScript(); + return new spell_gen_obsidian_armor_AuraScript(); } }; enum TournamentPennantSpells { - SPELL_PENNANT_STORMWIND_ASPIRANT = 62595, - SPELL_PENNANT_STORMWIND_VALIANT = 62596, - SPELL_PENNANT_STORMWIND_CHAMPION = 62594, - SPELL_PENNANT_GNOMEREGAN_ASPIRANT = 63394, - SPELL_PENNANT_GNOMEREGAN_VALIANT = 63395, - SPELL_PENNANT_GNOMEREGAN_CHAMPION = 63396, - SPELL_PENNANT_SEN_JIN_ASPIRANT = 63397, - SPELL_PENNANT_SEN_JIN_VALIANT = 63398, - SPELL_PENNANT_SEN_JIN_CHAMPION = 63399, - SPELL_PENNANT_SILVERMOON_ASPIRANT = 63401, - SPELL_PENNANT_SILVERMOON_VALIANT = 63402, - SPELL_PENNANT_SILVERMOON_CHAMPION = 63403, - SPELL_PENNANT_DARNASSUS_ASPIRANT = 63404, - SPELL_PENNANT_DARNASSUS_VALIANT = 63405, - SPELL_PENNANT_DARNASSUS_CHAMPION = 63406, - SPELL_PENNANT_EXODAR_ASPIRANT = 63421, - SPELL_PENNANT_EXODAR_VALIANT = 63422, - SPELL_PENNANT_EXODAR_CHAMPION = 63423, - SPELL_PENNANT_IRONFORGE_ASPIRANT = 63425, - SPELL_PENNANT_IRONFORGE_VALIANT = 63426, - SPELL_PENNANT_IRONFORGE_CHAMPION = 63427, - SPELL_PENNANT_UNDERCITY_ASPIRANT = 63428, - SPELL_PENNANT_UNDERCITY_VALIANT = 63429, - SPELL_PENNANT_UNDERCITY_CHAMPION = 63430, - SPELL_PENNANT_ORGRIMMAR_ASPIRANT = 63431, - SPELL_PENNANT_ORGRIMMAR_VALIANT = 63432, - SPELL_PENNANT_ORGRIMMAR_CHAMPION = 63433, - SPELL_PENNANT_THUNDER_BLUFF_ASPIRANT = 63434, - SPELL_PENNANT_THUNDER_BLUFF_VALIANT = 63435, - SPELL_PENNANT_THUNDER_BLUFF_CHAMPION = 63436, - SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT = 63606, - SPELL_PENNANT_ARGENT_CRUSADE_VALIANT = 63500, - SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION = 63501, - SPELL_PENNANT_EBON_BLADE_ASPIRANT = 63607, - SPELL_PENNANT_EBON_BLADE_VALIANT = 63608, - SPELL_PENNANT_EBON_BLADE_CHAMPION = 63609, + SPELL_PENNANT_STORMWIND_ASPIRANT = 62595, + SPELL_PENNANT_STORMWIND_VALIANT = 62596, + SPELL_PENNANT_STORMWIND_CHAMPION = 62594, + SPELL_PENNANT_GNOMEREGAN_ASPIRANT = 63394, + SPELL_PENNANT_GNOMEREGAN_VALIANT = 63395, + SPELL_PENNANT_GNOMEREGAN_CHAMPION = 63396, + SPELL_PENNANT_SEN_JIN_ASPIRANT = 63397, + SPELL_PENNANT_SEN_JIN_VALIANT = 63398, + SPELL_PENNANT_SEN_JIN_CHAMPION = 63399, + SPELL_PENNANT_SILVERMOON_ASPIRANT = 63401, + SPELL_PENNANT_SILVERMOON_VALIANT = 63402, + SPELL_PENNANT_SILVERMOON_CHAMPION = 63403, + SPELL_PENNANT_DARNASSUS_ASPIRANT = 63404, + SPELL_PENNANT_DARNASSUS_VALIANT = 63405, + SPELL_PENNANT_DARNASSUS_CHAMPION = 63406, + SPELL_PENNANT_EXODAR_ASPIRANT = 63421, + SPELL_PENNANT_EXODAR_VALIANT = 63422, + SPELL_PENNANT_EXODAR_CHAMPION = 63423, + SPELL_PENNANT_IRONFORGE_ASPIRANT = 63425, + SPELL_PENNANT_IRONFORGE_VALIANT = 63426, + SPELL_PENNANT_IRONFORGE_CHAMPION = 63427, + SPELL_PENNANT_UNDERCITY_ASPIRANT = 63428, + SPELL_PENNANT_UNDERCITY_VALIANT = 63429, + SPELL_PENNANT_UNDERCITY_CHAMPION = 63430, + SPELL_PENNANT_ORGRIMMAR_ASPIRANT = 63431, + SPELL_PENNANT_ORGRIMMAR_VALIANT = 63432, + SPELL_PENNANT_ORGRIMMAR_CHAMPION = 63433, + SPELL_PENNANT_THUNDER_BLUFF_ASPIRANT = 63434, + SPELL_PENNANT_THUNDER_BLUFF_VALIANT = 63435, + SPELL_PENNANT_THUNDER_BLUFF_CHAMPION = 63436, + SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT = 63606, + SPELL_PENNANT_ARGENT_CRUSADE_VALIANT = 63500, + SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION = 63501, + SPELL_PENNANT_EBON_BLADE_ASPIRANT = 63607, + SPELL_PENNANT_EBON_BLADE_VALIANT = 63608, + SPELL_PENNANT_EBON_BLADE_CHAMPION = 63609 }; enum TournamentMounts { - NPC_STORMWIND_STEED = 33217, - NPC_IRONFORGE_RAM = 33316, - NPC_GNOMEREGAN_MECHANOSTRIDER = 33317, - NPC_EXODAR_ELEKK = 33318, - NPC_DARNASSIAN_NIGHTSABER = 33319, - NPC_ORGRIMMAR_WOLF = 33320, - NPC_DARK_SPEAR_RAPTOR = 33321, - NPC_THUNDER_BLUFF_KODO = 33322, - NPC_SILVERMOON_HAWKSTRIDER = 33323, - NPC_FORSAKEN_WARHORSE = 33324, - NPC_ARGENT_WARHORSE = 33782, - NPC_ARGENT_STEED_ASPIRANT = 33845, - NPC_ARGENT_HAWKSTRIDER_ASPIRANT = 33844, + NPC_STORMWIND_STEED = 33217, + NPC_IRONFORGE_RAM = 33316, + NPC_GNOMEREGAN_MECHANOSTRIDER = 33317, + NPC_EXODAR_ELEKK = 33318, + NPC_DARNASSIAN_NIGHTSABER = 33319, + NPC_ORGRIMMAR_WOLF = 33320, + NPC_DARK_SPEAR_RAPTOR = 33321, + NPC_THUNDER_BLUFF_KODO = 33322, + NPC_SILVERMOON_HAWKSTRIDER = 33323, + NPC_FORSAKEN_WARHORSE = 33324, + NPC_ARGENT_WARHORSE = 33782, + NPC_ARGENT_STEED_ASPIRANT = 33845, + NPC_ARGENT_HAWKSTRIDER_ASPIRANT = 33844 }; enum TournamentQuestsAchievements { - ACHIEVEMENT_CHAMPION_STORMWIND = 2781, - ACHIEVEMENT_CHAMPION_DARNASSUS = 2777, - ACHIEVEMENT_CHAMPION_IRONFORGE = 2780, - ACHIEVEMENT_CHAMPION_GNOMEREGAN = 2779, - ACHIEVEMENT_CHAMPION_THE_EXODAR = 2778, - ACHIEVEMENT_CHAMPION_ORGRIMMAR = 2783, - ACHIEVEMENT_CHAMPION_SEN_JIN = 2784, - ACHIEVEMENT_CHAMPION_THUNDER_BLUFF = 2786, - ACHIEVEMENT_CHAMPION_UNDERCITY = 2787, - ACHIEVEMENT_CHAMPION_SILVERMOON = 2785, - ACHIEVEMENT_ARGENT_VALOR = 2758, - ACHIEVEMENT_CHAMPION_ALLIANCE = 2782, - ACHIEVEMENT_CHAMPION_HORDE = 2788, - - QUEST_VALIANT_OF_STORMWIND = 13593, - QUEST_A_VALIANT_OF_STORMWIND = 13684, - QUEST_VALIANT_OF_DARNASSUS = 13706, - QUEST_A_VALIANT_OF_DARNASSUS = 13689, - QUEST_VALIANT_OF_IRONFORGE = 13703, - QUEST_A_VALIANT_OF_IRONFORGE = 13685, - QUEST_VALIANT_OF_GNOMEREGAN = 13704, - QUEST_A_VALIANT_OF_GNOMEREGAN = 13688, - QUEST_VALIANT_OF_THE_EXODAR = 13705, - QUEST_A_VALIANT_OF_THE_EXODAR = 13690, - QUEST_VALIANT_OF_ORGRIMMAR = 13707, - QUEST_A_VALIANT_OF_ORGRIMMAR = 13691, - QUEST_VALIANT_OF_SEN_JIN = 13708, - QUEST_A_VALIANT_OF_SEN_JIN = 13693, - QUEST_VALIANT_OF_THUNDER_BLUFF = 13709, - QUEST_A_VALIANT_OF_THUNDER_BLUFF = 13694, - QUEST_VALIANT_OF_UNDERCITY = 13710, - QUEST_A_VALIANT_OF_UNDERCITY = 13695, - QUEST_VALIANT_OF_SILVERMOON = 13711, - QUEST_A_VALIANT_OF_SILVERMOON = 13696, + ACHIEVEMENT_CHAMPION_STORMWIND = 2781, + ACHIEVEMENT_CHAMPION_DARNASSUS = 2777, + ACHIEVEMENT_CHAMPION_IRONFORGE = 2780, + ACHIEVEMENT_CHAMPION_GNOMEREGAN = 2779, + ACHIEVEMENT_CHAMPION_THE_EXODAR = 2778, + ACHIEVEMENT_CHAMPION_ORGRIMMAR = 2783, + ACHIEVEMENT_CHAMPION_SEN_JIN = 2784, + ACHIEVEMENT_CHAMPION_THUNDER_BLUFF = 2786, + ACHIEVEMENT_CHAMPION_UNDERCITY = 2787, + ACHIEVEMENT_CHAMPION_SILVERMOON = 2785, + ACHIEVEMENT_ARGENT_VALOR = 2758, + ACHIEVEMENT_CHAMPION_ALLIANCE = 2782, + ACHIEVEMENT_CHAMPION_HORDE = 2788, + + QUEST_VALIANT_OF_STORMWIND = 13593, + QUEST_A_VALIANT_OF_STORMWIND = 13684, + QUEST_VALIANT_OF_DARNASSUS = 13706, + QUEST_A_VALIANT_OF_DARNASSUS = 13689, + QUEST_VALIANT_OF_IRONFORGE = 13703, + QUEST_A_VALIANT_OF_IRONFORGE = 13685, + QUEST_VALIANT_OF_GNOMEREGAN = 13704, + QUEST_A_VALIANT_OF_GNOMEREGAN = 13688, + QUEST_VALIANT_OF_THE_EXODAR = 13705, + QUEST_A_VALIANT_OF_THE_EXODAR = 13690, + QUEST_VALIANT_OF_ORGRIMMAR = 13707, + QUEST_A_VALIANT_OF_ORGRIMMAR = 13691, + QUEST_VALIANT_OF_SEN_JIN = 13708, + QUEST_A_VALIANT_OF_SEN_JIN = 13693, + QUEST_VALIANT_OF_THUNDER_BLUFF = 13709, + QUEST_A_VALIANT_OF_THUNDER_BLUFF = 13694, + QUEST_VALIANT_OF_UNDERCITY = 13710, + QUEST_A_VALIANT_OF_UNDERCITY = 13695, + QUEST_VALIANT_OF_SILVERMOON = 13711, + QUEST_A_VALIANT_OF_SILVERMOON = 13696 }; class spell_gen_on_tournament_mount : public SpellScriptLoader @@ -2656,376 +2666,499 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader } }; -class spell_gen_tournament_pennant : public SpellScriptLoader +class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader { public: - spell_gen_tournament_pennant() : SpellScriptLoader("spell_gen_tournament_pennant") { } + spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { } - class spell_gen_tournament_pennant_AuraScript : public AuraScript + class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_tournament_pennant_AuraScript); + PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript); bool Load() OVERRIDE { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleDummy(SpellEffIndex effIndex) { - if (Unit* caster = GetCaster()) - if (!caster->GetVehicleBase()) - caster->RemoveAurasDueToSpell(GetId()); + Player* player = GetCaster()->ToPlayer(); + uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); + int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + + FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); + + if (!factionEntry) + return; + + // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated) + // Not when player already has equal or higher rep with this faction + if (player->GetReputationMgr().GetBaseReputation(factionEntry) < repChange) + player->GetReputationMgr().SetReputation(factionEntry, repChange); + + // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation } void Register() OVERRIDE { - OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_tournament_pennant_AuraScript(); + return new spell_gen_oracle_wolvar_reputation_SpellScript(); } }; -enum ChaosBlast +enum OrcDisguiseSpells { - SPELL_CHAOS_BLAST = 37675, + SPELL_ORC_DISGUISE_TRIGGER = 45759, + SPELL_ORC_DISGUISE_MALE = 45760, + SPELL_ORC_DISGUISE_FEMALE = 45762 }; -class spell_gen_chaos_blast : public SpellScriptLoader +class spell_gen_orc_disguise : public SpellScriptLoader { public: - spell_gen_chaos_blast() : SpellScriptLoader("spell_gen_chaos_blast") { } + spell_gen_orc_disguise() : SpellScriptLoader("spell_gen_orc_disguise") { } - class spell_gen_chaos_blast_SpellScript : public SpellScript + class spell_gen_orc_disguise_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_chaos_blast_SpellScript) + PrepareSpellScript(spell_gen_orc_disguise_SpellScript); - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST)) + if (!sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_TRIGGER) || + !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_MALE) || + !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_FEMALE)) return false; return true; } - void HandleDummy(SpellEffIndex /* effIndex */) + + void HandleScript(SpellEffIndex /*effIndex*/) { - int32 basepoints0 = 100; Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - caster->CastCustomSpell(target, SPELL_CHAOS_BLAST, &basepoints0, NULL, NULL, true); + if (Player* target = GetHitPlayer()) + { + uint8 gender = target->getGender(); + if (!gender) + caster->CastSpell(target, SPELL_ORC_DISGUISE_MALE, true); + else + caster->CastSpell(target, SPELL_ORC_DISGUISE_FEMALE, true); + } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_orc_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_chaos_blast_SpellScript(); + return new spell_gen_orc_disguise_SpellScript(); } +}; +enum ParachuteSpells +{ + SPELL_PARACHUTE = 45472, + SPELL_PARACHUTE_BUFF = 44795, }; -class spell_gen_ds_flush_knockback : public SpellScriptLoader +// 45472 Parachute +class spell_gen_parachute : public SpellScriptLoader { public: - spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") {} + spell_gen_parachute() : SpellScriptLoader("spell_gen_parachute") { } - class spell_gen_ds_flush_knockback_SpellScript : public SpellScript + class spell_gen_parachute_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript); + PrepareAuraScript(spell_gen_parachute_AuraScript); - void HandleScript(SpellEffIndex /*effIndex*/) + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - // Here the target is the water spout and determines the position where the player is knocked from - if (Unit* target = GetHitUnit()) - { - if (Player* player = GetCaster()->ToPlayer()) + if (!sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) || + !sSpellMgr->GetSpellInfo(SPELL_PARACHUTE_BUFF)) + return false; + return true; + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + if (Player* target = GetTarget()->ToPlayer()) + if (target->IsFalling()) { - float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target)); - float verticalSpeed = 8.0f; - // This method relies on the Dalaran Sewer map disposition and Water Spout position - // What we do is knock the player from a position exactly behind him and at the end of the pipe - player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); + target->RemoveAurasDueToSpell(SPELL_PARACHUTE); + target->CastSpell(target, SPELL_PARACHUTE_BUFF, true); } - } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_ds_flush_knockback_SpellScript(); + return new spell_gen_parachute_AuraScript(); } }; -class spell_gen_wg_water : public SpellScriptLoader +enum ParachuteIC +{ + SPELL_PARACHUTE_IC = 66657 +}; + +class spell_gen_parachute_ic : public SpellScriptLoader { public: - spell_gen_wg_water() : SpellScriptLoader("spell_gen_wg_water") {} + spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } - class spell_gen_wg_water_SpellScript : public SpellScript + class spell_gen_parachute_ic_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_wg_water_SpellScript); + PrepareAuraScript(spell_gen_parachute_ic_AuraScript) - SpellCastResult CheckCast() + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { - if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster())) - return SPELL_FAILED_DONT_REPORT; - return SPELL_CAST_OK; + if (Player* target = GetTarget()->ToPlayer()) + if (target->m_movementInfo.fallTime > 2000) + target->CastSpell(target, SPELL_PARACHUTE_IC, true); } void Register() OVERRIDE { - OnCheckCast += SpellCheckCastFn(spell_gen_wg_water_SpellScript::CheckCast); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_wg_water_SpellScript(); + return new spell_gen_parachute_ic_AuraScript(); } }; -class spell_gen_count_pct_from_max_hp : public SpellScriptLoader +enum PetSummoned +{ + NPC_DOOMGUARD = 11859, + NPC_INFERNAL = 89, + NPC_IMP = 416 +}; + +class spell_gen_pet_summoned : public SpellScriptLoader { public: - spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { } + spell_gen_pet_summoned() : SpellScriptLoader("spell_gen_pet_summoned") { } - class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript + class spell_gen_pet_summoned_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) + PrepareSpellScript(spell_gen_pet_summoned_SpellScript); - public: - spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } + bool Load() OVERRIDE + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - void RecalculateDamage() + void HandleScript(SpellEffIndex /*effIndex*/) { - if (!_damagePct) - _damagePct = GetHitDamage(); + Player* player = GetCaster()->ToPlayer(); + if (player->GetLastPetNumber()) + { + PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET; + if (Pet* newPet = new Pet(player, newPetType)) + { + if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true)) + { + // revive the pet if it is dead + if (newPet->getDeathState() == DEAD) + newPet->setDeathState(ALIVE); - SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct)); + newPet->SetFullHealth(); + newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType())); + + switch (newPet->GetEntry()) + { + case NPC_DOOMGUARD: + case NPC_INFERNAL: + newPet->SetEntry(NPC_IMP); + break; + default: + break; + } + } + else + delete newPet; + } + } } void Register() OVERRIDE { - OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage); + OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } - - private: - int32 _damagePct; }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct); + return new spell_gen_pet_summoned_SpellScript(); } - - private: - int32 _damagePct; }; -class spell_gen_despawn_self : public SpellScriptLoader +class spell_gen_profession_research : public SpellScriptLoader { -public: - spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { } - - class spell_gen_despawn_self_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_despawn_self_SpellScript); + public: + spell_gen_profession_research() : SpellScriptLoader("spell_gen_profession_research") { } - bool Load() OVERRIDE + class spell_gen_profession_research_SpellScript : public SpellScript { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } + PrepareSpellScript(spell_gen_profession_research_SpellScript); - void HandleDummy(SpellEffIndex effIndex) - { - if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) - GetCaster()->ToCreature()->DespawnOrUnsummon(); - } + bool Load() OVERRIDE + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - void Register() OVERRIDE + SpellCastResult CheckRequirement() + { + if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + uint32 spellId = GetSpellInfo()->Id; + + // learn random explicit discovery recipe (if any) + if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) + caster->learnSpell(discoveredSpellId, false); + + caster->UpdateCraftSkill(spellId); + } + + void Register() OVERRIDE + { + OnCheckCast += SpellCheckCastFn(spell_gen_profession_research_SpellScript::CheckRequirement); + OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY); + return new spell_gen_profession_research_SpellScript(); } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_despawn_self_SpellScript(); - } }; -class spell_gen_touch_the_nightmare : public SpellScriptLoader +class spell_gen_remove_flight_auras : public SpellScriptLoader { -public: - spell_gen_touch_the_nightmare() : SpellScriptLoader("spell_gen_touch_the_nightmare") { } - - class spell_gen_touch_the_nightmare_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_touch_the_nightmare_SpellScript); + public: + spell_gen_remove_flight_auras() : SpellScriptLoader("spell_gen_remove_flight_auras") { } - void HandleDamageCalc(SpellEffIndex /*effIndex*/) + class spell_gen_remove_flight_auras_SpellScript : public SpellScript { - uint32 bp = GetCaster()->GetMaxHealth() * 0.3f; - SetHitDamage(bp); - } + PrepareSpellScript(spell_gen_remove_flight_auras_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + target->RemoveAurasByType(SPELL_AURA_FLY); + target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); + } + } - void Register() OVERRIDE + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_touch_the_nightmare_SpellScript::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE); + return new spell_gen_remove_flight_auras_SpellScript(); } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_gen_touch_the_nightmare_SpellScript(); - } }; -class spell_gen_dream_funnel: public SpellScriptLoader +enum Replenishment { -public: - spell_gen_dream_funnel() : SpellScriptLoader("spell_gen_dream_funnel") { } + SPELL_REPLENISHMENT = 57669, + SPELL_INFINITE_REPLENISHMENT = 61782 +}; - class spell_gen_dream_funnel_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_dream_funnel_AuraScript); +class spell_gen_replenishment : public SpellScriptLoader +{ + public: + spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { } - void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + class spell_gen_replenishment_AuraScript : public AuraScript { - if (GetCaster()) - amount = GetCaster()->GetMaxHealth() * 0.05f; + PrepareAuraScript(spell_gen_replenishment_AuraScript); - canBeRecalculated = false; - } + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT) || + !sSpellMgr->GetSpellInfo(SPELL_INFINITE_REPLENISHMENT)) + return false; + return true; + } + + bool Load() OVERRIDE + { + return GetUnitOwner()->GetPower(POWER_MANA); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + switch (GetSpellInfo()->Id) + { + case SPELL_REPLENISHMENT: + amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f; + break; + case SPELL_INFINITE_REPLENISHMENT: + amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f; + break; + default: + break; + } + } + + void Register() OVERRIDE + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); + } + }; - void Register() OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); + return new spell_gen_replenishment_AuraScript(); } - }; - - AuraScript* GetAuraScript() const OVERRIDE - { - return new spell_gen_dream_funnel_AuraScript(); - } }; -enum GenericBandage +enum SeaforiumSpells { - SPELL_RECENTLY_BANDAGED = 11196, + SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT = 60937 }; -class spell_gen_bandage : public SpellScriptLoader +class spell_gen_seaforium_blast : public SpellScriptLoader { public: - spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { } + spell_gen_seaforium_blast() : SpellScriptLoader("spell_gen_seaforium_blast") { } - class spell_gen_bandage_SpellScript : public SpellScript + class spell_gen_seaforium_blast_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_bandage_SpellScript); + PrepareSpellScript(spell_gen_seaforium_blast_SpellScript); - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED)) + if (!sSpellMgr->GetSpellInfo(SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT)) return false; return true; } - SpellCastResult CheckCast() + bool Load() OVERRIDE { - if (Unit* target = GetExplTargetUnit()) - { - if (target->HasAura(SPELL_RECENTLY_BANDAGED)) - return SPELL_FAILED_TARGET_AURASTATE; - } - return SPELL_CAST_OK; + // OriginalCaster is always available in Spell::prepare + return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; } - void HandleScript() + void AchievementCredit(SpellEffIndex /*effIndex*/) { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true); + // but in effect handling OriginalCaster can become NULL + if (Unit* originalCaster = GetOriginalCaster()) + if (GameObject* go = GetHitGObj()) + if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) + originalCaster->CastSpell(originalCaster, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true); } void Register() OVERRIDE { - OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast); - AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript); + OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_bandage_SpellScript(); + return new spell_gen_seaforium_blast_SpellScript(); } }; -enum GenericLifebloom +enum SpectatorCheerTrigger { - SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL = 43422, - SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL = 52552, - SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL = 53692, - SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL = 57763, - SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL = 66094, + EMOTE_ONE_SHOT_CHEER = 4, + EMOTE_ONE_SHOT_EXCLAMATION = 5, + EMOTE_ONE_SHOT_APPLAUD = 21 }; -class spell_gen_lifebloom : public SpellScriptLoader +uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, EMOTE_ONE_SHOT_APPLAUD }; + +class spell_gen_spectator_cheer_trigger : public SpellScriptLoader { public: - spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + spell_gen_spectator_cheer_trigger() : SpellScriptLoader("spell_gen_spectator_cheer_trigger") { } - class spell_gen_lifebloom_AuraScript : public AuraScript + class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_lifebloom_AuraScript); + PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript) - public: - spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]); + } - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + void Register() OVERRIDE { - if (!sSpellMgr->GetSpellInfo(_spellId)) - return false; - return true; + OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } + }; - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_gen_spectator_cheer_trigger_SpellScript(); + } +}; + +class spell_gen_spirit_healer_res : public SpellScriptLoader +{ + public: + spell_gen_spirit_healer_res(): SpellScriptLoader("spell_gen_spirit_healer_res") { } + + class spell_gen_spirit_healer_res_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_spirit_healer_res_SpellScript); + + bool Load() OVERRIDE { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) - return; + return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; + } - // final heal - GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID()); + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* originalCaster = GetOriginalCaster()->ToPlayer(); + if (Unit* target = GetHitUnit()) + { + WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); + data << uint64(target->GetGUID()); + originalCaster->GetSession()->SendPacket(&data); + } } void Register() OVERRIDE { - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } - - private: - uint32 _spellId; }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_lifebloom_AuraScript(_spellId); + return new spell_gen_spirit_healer_res_SpellScript(); } - - private: - uint32 _spellId; }; enum SummonElemental @@ -3046,7 +3179,7 @@ class spell_gen_summon_elemental : public SpellScriptLoader public: spell_gen_summon_elemental_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(_spellId)) return false; @@ -3087,658 +3220,492 @@ class spell_gen_summon_elemental : public SpellScriptLoader uint32 _spellId; }; -enum Mounts +enum TournamentMountsSpells { - SPELL_COLD_WEATHER_FLYING = 54197, - - // Magic Broom - SPELL_MAGIC_BROOM_60 = 42680, - SPELL_MAGIC_BROOM_100 = 42683, - SPELL_MAGIC_BROOM_150 = 42667, - SPELL_MAGIC_BROOM_280 = 42668, - - // Headless Horseman's Mount - SPELL_HEADLESS_HORSEMAN_MOUNT_60 = 51621, - SPELL_HEADLESS_HORSEMAN_MOUNT_100 = 48024, - SPELL_HEADLESS_HORSEMAN_MOUNT_150 = 51617, - SPELL_HEADLESS_HORSEMAN_MOUNT_280 = 48023, - - // Winged Steed of the Ebon Blade - SPELL_WINGED_STEED_150 = 54726, - SPELL_WINGED_STEED_280 = 54727, - - // Big Love Rocket - SPELL_BIG_LOVE_ROCKET_0 = 71343, - SPELL_BIG_LOVE_ROCKET_60 = 71344, - SPELL_BIG_LOVE_ROCKET_100 = 71345, - SPELL_BIG_LOVE_ROCKET_150 = 71346, - SPELL_BIG_LOVE_ROCKET_310 = 71347, - - // Invincible - SPELL_INVINCIBLE_60 = 72281, - SPELL_INVINCIBLE_100 = 72282, - SPELL_INVINCIBLE_150 = 72283, - SPELL_INVINCIBLE_310 = 72284, - - // Blazing Hippogryph - SPELL_BLAZING_HIPPOGRYPH_150 = 74854, - SPELL_BLAZING_HIPPOGRYPH_280 = 74855, - - // Celestial Steed - SPELL_CELESTIAL_STEED_60 = 75619, - SPELL_CELESTIAL_STEED_100 = 75620, - SPELL_CELESTIAL_STEED_150 = 75617, - SPELL_CELESTIAL_STEED_280 = 75618, - SPELL_CELESTIAL_STEED_310 = 76153, - - // X-53 Touring Rocket - SPELL_X53_TOURING_ROCKET_150 = 75957, - SPELL_X53_TOURING_ROCKET_280 = 75972, - SPELL_X53_TOURING_ROCKET_310 = 76154, + SPELL_LANCE_EQUIPPED = 62853 }; -class spell_gen_mount : public SpellScriptLoader +class spell_gen_summon_tournament_mount : public SpellScriptLoader { public: - spell_gen_mount(const char* name, uint32 mount0 = 0, uint32 mount60 = 0, uint32 mount100 = 0, uint32 mount150 = 0, uint32 mount280 = 0, uint32 mount310 = 0) : SpellScriptLoader(name), - _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } + spell_gen_summon_tournament_mount() : SpellScriptLoader("spell_gen_summon_tournament_mount") { } - class spell_gen_mount_SpellScript : public SpellScript + class spell_gen_summon_tournament_mount_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_mount_SpellScript); - - public: - spell_gen_mount_SpellScript(uint32 mount0, uint32 mount60, uint32 mount100, uint32 mount150, uint32 mount280, uint32 mount310) : SpellScript(), - _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } + PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript); - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - if (_mount0 && !sSpellMgr->GetSpellInfo(_mount0)) - return false; - if (_mount60 && !sSpellMgr->GetSpellInfo(_mount60)) - return false; - if (_mount100 && !sSpellMgr->GetSpellInfo(_mount100)) - return false; - if (_mount150 && !sSpellMgr->GetSpellInfo(_mount150)) - return false; - if (_mount280 && !sSpellMgr->GetSpellInfo(_mount280)) - return false; - if (_mount310 && !sSpellMgr->GetSpellInfo(_mount310)) + if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED)) return false; return true; } - void HandleMount(SpellEffIndex effIndex) + SpellCastResult CheckIfLanceEquiped() { - PreventHitDefaultEffect(effIndex); + if (GetCaster()->IsInDisallowedMountForm()) + GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); - if (Player* target = GetHitPlayer()) + if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED)) { - // Prevent stacking of mounts and client crashes upon dismounting - target->RemoveAurasByType(SPELL_AURA_MOUNTED, 0, GetHitAura()); - - // Triggered spell id dependent on riding skill and zone - bool canFly = false; - uint32 map = GetVirtualMapForMapAndZone(target->GetMapId(), target->GetZoneId()); - if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING))) - canFly = true; - - float x, y, z; - target->GetPosition(x, y, z); - uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z); - AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag); - if (!area || (canFly && (area->flags & AREA_FLAG_NO_FLY_ZONE))) - canFly = false; - - uint32 mount = 0; - switch (target->GetBaseSkillValue(SKILL_RIDING)) - { - case 0: - mount = _mount0; - break; - case 75: - mount = _mount60; - break; - case 150: - mount = _mount100; - break; - case 225: - if (canFly) - mount = _mount150; - else - mount = _mount100; - break; - case 300: - if (canFly) - { - if (_mount310 && target->Has310Flyer(false)) - mount = _mount310; - else - mount = _mount280; - } - else - mount = _mount100; - break; - default: - break; - } - - if (mount) - { - PreventHitAura(); - target->CastSpell(target, mount, true); - } + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED); + return SPELL_FAILED_CUSTOM_ERROR; } + + return SPELL_CAST_OK; } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount_SpellScript::CheckIfLanceEquiped); } - - private: - uint32 _mount0; - uint32 _mount60; - uint32 _mount100; - uint32 _mount150; - uint32 _mount280; - uint32 _mount310; }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310); + return new spell_gen_summon_tournament_mount_SpellScript(); } - - private: - uint32 _mount0; - uint32 _mount60; - uint32 _mount100; - uint32 _mount150; - uint32 _mount280; - uint32 _mount310; }; -enum FoamSword -{ - ITEM_FOAM_SWORD_GREEN = 45061, - ITEM_FOAM_SWORD_PINK = 45176, - ITEM_FOAM_SWORD_BLUE = 45177, - ITEM_FOAM_SWORD_RED = 45178, - ITEM_FOAM_SWORD_YELLOW = 45179, - SPELL_BONKED = 62991, - SPELL_FOAM_SWORD_DEFEAT = 62994, - SPELL_ON_GUARD = 62972, +enum MountedDuelSpells +{ + SPELL_ON_TOURNAMENT_MOUNT = 63034, + SPELL_MOUNTED_DUEL = 62875 }; -class spell_gen_upper_deck_create_foam_sword : public SpellScriptLoader +class spell_gen_tournament_duel : public SpellScriptLoader { public: - spell_gen_upper_deck_create_foam_sword() : SpellScriptLoader("spell_gen_upper_deck_create_foam_sword") { } + spell_gen_tournament_duel() : SpellScriptLoader("spell_gen_tournament_duel") { } - class spell_gen_upper_deck_create_foam_sword_SpellScript : public SpellScript + class spell_gen_tournament_duel_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_upper_deck_create_foam_sword_SpellScript); + PrepareSpellScript(spell_gen_tournament_duel_SpellScript); - void HandleScript(SpellEffIndex effIndex) + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE { - if (Player* player = GetHitPlayer()) + if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) || + !sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL)) + return false; + return true; + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* rider = GetCaster()->GetCharmer()) { - static uint32 const itemId[5] = { ITEM_FOAM_SWORD_GREEN, ITEM_FOAM_SWORD_PINK, ITEM_FOAM_SWORD_BLUE, ITEM_FOAM_SWORD_RED, ITEM_FOAM_SWORD_YELLOW }; - // player can only have one of these items - for (uint8 i = 0; i < 5; ++i) + if (Player* playerTarget = GetHitPlayer()) { - if (player->HasItemCount(itemId[i], 1, true)) - return; + if (playerTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && playerTarget->GetVehicleBase()) + rider->CastSpell(playerTarget, SPELL_MOUNTED_DUEL, true); + } + else if (Unit* unitTarget = GetHitUnit()) + { + if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT)) + rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true); } - - CreateItem(effIndex, itemId[urand(0, 4)]); } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_upper_deck_create_foam_sword_SpellScript(); + return new spell_gen_tournament_duel_SpellScript(); } }; -class spell_gen_bonked : public SpellScriptLoader +class spell_gen_tournament_pennant : public SpellScriptLoader { public: - spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { } + spell_gen_tournament_pennant() : SpellScriptLoader("spell_gen_tournament_pennant") { } - class spell_gen_bonked_SpellScript : public SpellScript + class spell_gen_tournament_pennant_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_bonked_SpellScript); + PrepareAuraScript(spell_gen_tournament_pennant_AuraScript); - void HandleScript(SpellEffIndex /*effIndex*/) + bool Load() OVERRIDE { - if (Player* target = GetHitPlayer()) - { - Aura const* aura = GetHitAura(); - if (!(aura && aura->GetStackAmount() == 3)) - return; - - target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true); - target->RemoveAurasDueToSpell(SPELL_BONKED); + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - if (Aura const* aura = target->GetAura(SPELL_ON_GUARD)) - { - if (Item* item = target->GetItemByGuid(aura->GetCastItemGUID())) - target->DestroyItemCount(item->GetEntry(), 1, true); - } - } + void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (!caster->GetVehicleBase()) + caster->RemoveAurasDueToSpell(GetId()); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_bonked_SpellScript(); + return new spell_gen_tournament_pennant_AuraScript(); } }; -class spell_gen_gift_of_naaru : public SpellScriptLoader + + +enum PvPTrinketTriggeredSpells +{ + SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER = 72752, + SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF = 72757 +}; + +class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader { public: - spell_gen_gift_of_naaru() : SpellScriptLoader("spell_gen_gift_of_naaru") { } + spell_pvp_trinket_wotf_shared_cd() : SpellScriptLoader("spell_pvp_trinket_wotf_shared_cd") { } - class spell_gen_gift_of_naaru_AuraScript : public AuraScript + class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_gift_of_naaru_AuraScript); + PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript); - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + bool Load() OVERRIDE { - if (!GetCaster()) - return; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - float heal = 0.0f; - switch (GetSpellInfo()->SpellFamilyName) - { - case SPELLFAMILY_MAGE: - case SPELLFAMILY_WARLOCK: - case SPELLFAMILY_PRIEST: - heal = 1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())); - break; - case SPELLFAMILY_PALADIN: - case SPELLFAMILY_SHAMAN: - heal = std::max(1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())), 1.1f * float(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK))); - break; - case SPELLFAMILY_WARRIOR: - case SPELLFAMILY_HUNTER: - case SPELLFAMILY_DEATHKNIGHT: - heal = 1.1f * float(std::max(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetCaster()->GetTotalAttackPowerValue(RANGED_ATTACK))); - break; - case SPELLFAMILY_GENERIC: - default: - break; - } + bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) || + !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF)) + return false; + return true; + } - int32 healTick = floor(heal / aurEff->GetTotalTicks()); - amount += int32(std::max(healTick, 0)); + void HandleScript() + { + // This is only needed because spells cast from spell_linked_spell are triggered by default + // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD + GetCaster()->ToPlayer()->AddSpellAndCategoryCooldowns(GetSpellInfo(), GetCastItem() ? GetCastItem()->GetEntry() : 0, GetSpell()); } void Register() OVERRIDE { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_gift_of_naaru_AuraScript(); + return new spell_pvp_trinket_wotf_shared_cd_SpellScript(); } }; -enum Replenishment +enum FriendOrFowl { - SPELL_REPLENISHMENT = 57669, - SPELL_INFINITE_REPLENISHMENT = 61782 + SPELL_TURKEY_VENGEANCE = 25285 }; -class spell_gen_replenishment : public SpellScriptLoader +class spell_gen_turkey_marker : public SpellScriptLoader { public: - spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { } + spell_gen_turkey_marker() : SpellScriptLoader("spell_gen_turkey_marker") { } - class spell_gen_replenishment_AuraScript : public AuraScript + class spell_gen_turkey_marker_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_replenishment_AuraScript); + PrepareAuraScript(spell_gen_turkey_marker_AuraScript); - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - if (!sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT) || - !sSpellMgr->GetSpellInfo(SPELL_INFINITE_REPLENISHMENT)) - return false; - return true; - } + // store stack apply times, so we can pop them while they expire + _applyTimes.push_back(getMSTime()); + Unit* target = GetTarget(); - bool Load() OVERRIDE - { - return GetUnitOwner()->GetPower(POWER_MANA); + // on stack 15 cast the achievement crediting spell + if (GetStackAmount() >= 15) + target->CastSpell(target, SPELL_TURKEY_VENGEANCE, true, NULL, aurEff, GetCasterGUID()); } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + void OnPeriodic(AuraEffect const* /*aurEff*/) { - switch (GetSpellInfo()->Id) - { - case SPELL_REPLENISHMENT: - amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f; - break; - case SPELL_INFINITE_REPLENISHMENT: - amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f; - break; - default: - break; - } + if (_applyTimes.empty()) + return; + + // pop stack if it expired for us + if (_applyTimes.front() + GetMaxDuration() < getMSTime()) + ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); } void Register() OVERRIDE { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); + AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } + + std::list<uint32> _applyTimes; }; AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_replenishment_AuraScript(); + return new spell_gen_turkey_marker_AuraScript(); } }; -enum ServiceUniform +enum FoamSword { - SPELL_SERVICE_UNIFORM = 71450, - - MODEL_GOBLIN_MALE = 31002, - MODEL_GOBLIN_FEMALE = 31003, + ITEM_FOAM_SWORD_GREEN = 45061, + ITEM_FOAM_SWORD_PINK = 45176, + ITEM_FOAM_SWORD_BLUE = 45177, + ITEM_FOAM_SWORD_RED = 45178, + ITEM_FOAM_SWORD_YELLOW = 45179 }; -class spell_gen_aura_service_uniform : public SpellScriptLoader +class spell_gen_upper_deck_create_foam_sword : public SpellScriptLoader { public: - spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { } + spell_gen_upper_deck_create_foam_sword() : SpellScriptLoader("spell_gen_upper_deck_create_foam_sword") { } - class spell_gen_aura_service_uniform_AuraScript : public AuraScript + class spell_gen_upper_deck_create_foam_sword_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM)) - return false; - return true; - } + PrepareSpellScript(spell_gen_upper_deck_create_foam_sword_SpellScript); - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleScript(SpellEffIndex effIndex) { - // Apply model goblin - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) + if (Player* player = GetHitPlayer()) { - if (target->getGender() == GENDER_MALE) - target->SetDisplayId(MODEL_GOBLIN_MALE); - else - target->SetDisplayId(MODEL_GOBLIN_FEMALE); - } - } + static uint32 const itemId[5] = { ITEM_FOAM_SWORD_GREEN, ITEM_FOAM_SWORD_PINK, ITEM_FOAM_SWORD_BLUE, ITEM_FOAM_SWORD_RED, ITEM_FOAM_SWORD_YELLOW }; + // player can only have one of these items + for (uint8 i = 0; i < 5; ++i) + { + if (player->HasItemCount(itemId[i], 1, true)) + return; + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->RestoreDisplayId(); + CreateItem(effIndex, itemId[urand(0, 4)]); + } } void Register() OVERRIDE { - AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_aura_service_uniform_AuraScript(); + return new spell_gen_upper_deck_create_foam_sword_SpellScript(); } }; -enum OrcDisguiseSpells +enum VehicleScaling { - SPELL_ORC_DISGUISE_TRIGGER = 45759, - SPELL_ORC_DISGUISE_MALE = 45760, - SPELL_ORC_DISGUISE_FEMALE = 45762, + SPELL_GEAR_SCALING = 66668 }; -class spell_gen_orc_disguise : public SpellScriptLoader +class spell_gen_vehicle_scaling : public SpellScriptLoader { public: - spell_gen_orc_disguise() : SpellScriptLoader("spell_gen_orc_disguise") { } + spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } - class spell_gen_orc_disguise_SpellScript : public SpellScript + class spell_gen_vehicle_scaling_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_orc_disguise_SpellScript); + PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); - bool Validate(SpellInfo const* /*spell*/) OVERRIDE + bool Load() OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_MALE) || - !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_FEMALE)) - return false; - return true; + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } - void HandleScript(SpellEffIndex /*effIndex*/) + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { Unit* caster = GetCaster(); - if (Player* target = GetHitPlayer()) + float factor; + uint16 baseItemLevel; + + /// @todo Reserach coeffs for different vehicles + switch (GetId()) { - uint8 gender = target->getGender(); - if (!gender) - caster->CastSpell(target, SPELL_ORC_DISGUISE_MALE, true); - else - caster->CastSpell(target, SPELL_ORC_DISGUISE_FEMALE, true); + case SPELL_GEAR_SCALING: + factor = 1.0f; + baseItemLevel = 205; + break; + default: + factor = 1.0f; + baseItemLevel = 170; + break; } + + float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); + if (avgILvl < baseItemLevel) + return; /// @todo Research possibility of scaling down + + amount = uint16((avgILvl - baseItemLevel) * factor); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_orc_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_orc_disguise_SpellScript(); + return new spell_gen_vehicle_scaling_AuraScript(); } }; -enum WhisperGulchYoggSaronWhisper +enum VendorBarkTrigger { - SPELL_YOGG_SARON_WHISPER_DUMMY = 29072 + NPC_AMPHITHEATER_VENDOR = 30098, + SAY_AMPHITHEATER_VENDOR = 0 }; -class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader +class spell_gen_vendor_bark_trigger : public SpellScriptLoader { public: - spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { } + spell_gen_vendor_bark_trigger() : SpellScriptLoader("spell_gen_vendor_bark_trigger") { } - class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript + class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript { - PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE - { - if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY)) - return false; - return true; - } + PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript) - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + void HandleDummy(SpellEffIndex /* effIndex */) { - PreventDefaultAction(); - GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true); + if (Creature* vendor = GetCaster()->ToCreature()) + if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR) + vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR); } void Register() OVERRIDE { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; - AuraScript* GetAuraScript() const OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript(); + return new spell_gen_vendor_bark_trigger_SpellScript(); } -}; -enum SpectatorCheerTrigger -{ - EMOTE_ONE_SHOT_CHEER = 4, - EMOTE_ONE_SHOT_EXCLAMATION = 5, - EMOTE_ONE_SHOT_APPLAUD = 21 }; -uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, EMOTE_ONE_SHOT_APPLAUD }; - -class spell_gen_spectator_cheer_trigger : public SpellScriptLoader +class spell_gen_wg_water : public SpellScriptLoader { public: - spell_gen_spectator_cheer_trigger() : SpellScriptLoader("spell_gen_spectator_cheer_trigger") { } + spell_gen_wg_water() : SpellScriptLoader("spell_gen_wg_water") { } - class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript + class spell_gen_wg_water_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript) + PrepareSpellScript(spell_gen_wg_water_SpellScript); - void HandleDummy(SpellEffIndex /*effIndex*/) + SpellCastResult CheckCast() { - GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]); + if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster())) + return SPELL_FAILED_DONT_REPORT; + return SPELL_CAST_OK; } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_gen_wg_water_SpellScript::CheckCast); } }; SpellScript* GetSpellScript() const OVERRIDE { - return new spell_gen_spectator_cheer_trigger_SpellScript(); + return new spell_gen_wg_water_SpellScript(); } - }; -enum VendorBarkTrigger - +enum WhisperGulchYoggSaronWhisper { - NPC_AMPHITHEATER_VENDOR = 30098, - SAY_AMPHITHEATER_VENDOR = 0 + SPELL_YOGG_SARON_WHISPER_DUMMY = 29072 }; -class spell_gen_vendor_bark_trigger : public SpellScriptLoader +class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader { public: - spell_gen_vendor_bark_trigger() : SpellScriptLoader("spell_gen_vendor_bark_trigger") { } + spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { } - class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript + class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript { - PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript) + PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript); - void HandleDummy(SpellEffIndex /* effIndex */) + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (Creature* vendor = GetCaster()->ToCreature()) - if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR) - vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR); + if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY)) + return false; + return true; + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true); } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; - SpellScript* GetSpellScript() const OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - return new spell_gen_vendor_bark_trigger_SpellScript(); + return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript(); } - }; void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); new spell_gen_adaptive_warding(); + new spell_gen_allow_cast_from_item_only(); + new spell_gen_animal_blood(); new spell_gen_aura_of_anger(); + new spell_gen_aura_service_uniform(); new spell_gen_av_drekthar_presence(); + new spell_gen_bandage(); + new spell_gen_bonked(); + new spell_gen_break_shield("spell_gen_break_shield"); + new spell_gen_break_shield("spell_gen_tournament_counterattack"); new spell_gen_burn_brutallus(); new spell_gen_cannibalize(); - new spell_gen_create_lance(); - new spell_gen_netherbloom(); - new spell_gen_nightmare_vine(); - new spell_gen_obsidian_armor(); - new spell_gen_parachute(); - new spell_gen_pet_summoned(); - new spell_gen_remove_flight_auras(); - new spell_creature_permanent_feign_death(); - new spell_pvp_trinket_wotf_shared_cd(); - new spell_gen_animal_blood(); - new spell_gen_divine_storm_cd_reset(); - new spell_gen_parachute_ic(); - new spell_gen_gunship_portal(); - new spell_gen_dungeon_credit(); - new spell_gen_profession_research(); - new spell_generic_clone(); - new spell_generic_clone_weapon(); + new spell_gen_chaos_blast(); + new spell_gen_clone(); + new spell_gen_clone_weapon(); new spell_gen_clone_weapon_aura(); - new spell_gen_seaforium_blast(); - new spell_gen_turkey_marker(); - new spell_gen_lifeblood(); - new spell_gen_magic_rooster(); - new spell_gen_allow_cast_from_item_only(); - new spell_gen_launch(); - new spell_gen_vehicle_scaling(); - new spell_gen_oracle_wolvar_reputation(); - new spell_gen_damage_reduction_aura(); - new spell_gen_dummy_trigger(); - new spell_gen_spirit_healer_res(); - new spell_gen_gadgetzan_transporter_backfire(); - new spell_gen_gnomish_transporter(); + new spell_gen_count_pct_from_max_hp("spell_gen_default_count_pct_from_max_hp"); + new spell_gen_count_pct_from_max_hp("spell_gen_50pct_count_pct_from_max_hp", 50); + new spell_gen_count_pct_from_max_hp("spell_gen_30pct_count_pct_from_max_hp", 30); + new spell_gen_create_lance(); + new spell_gen_creature_permanent_feign_death(); new spell_gen_dalaran_disguise("spell_gen_sunreaver_disguise"); new spell_gen_dalaran_disguise("spell_gen_silver_covenant_disguise"); - new spell_gen_elune_candle(); - new spell_gen_break_shield("spell_gen_break_shield"); - new spell_gen_break_shield("spell_gen_tournament_counterattack"); - new spell_gen_mounted_charge(); + new spell_gen_damage_reduction_aura(); new spell_gen_defend(); - new spell_gen_tournament_duel(); - new spell_gen_summon_tournament_mount(); - new spell_gen_on_tournament_mount(); - new spell_gen_tournament_pennant(); - new spell_gen_chaos_blast(); - new spell_gen_ds_flush_knockback(); - new spell_gen_wg_water(); - new spell_gen_count_pct_from_max_hp("spell_gen_default_count_pct_from_max_hp"); - new spell_gen_count_pct_from_max_hp("spell_gen_50pct_count_pct_from_max_hp", 50); new spell_gen_despawn_self(); - new spell_gen_touch_the_nightmare(); + new spell_gen_divine_storm_cd_reset(); new spell_gen_dream_funnel(); - new spell_gen_bandage(); + new spell_gen_ds_flush_knockback(); + new spell_gen_dummy_trigger(); + new spell_gen_dungeon_credit(); + new spell_gen_elune_candle(); + new spell_gen_gadgetzan_transporter_backfire(); + new spell_gen_gift_of_naaru(); + new spell_gen_gnomish_transporter(); + new spell_gen_gunship_portal(); + new spell_gen_launch(); + new spell_gen_lifeblood(); new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_cenarion_scout_lifebloom", SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_twisted_visage_lifebloom", SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_faction_champion_dru_lifebloom", SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL); - new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL); - new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL); + new spell_gen_magic_rooster(); new spell_gen_mount("spell_magic_broom", 0, SPELL_MAGIC_BROOM_60, SPELL_MAGIC_BROOM_100, SPELL_MAGIC_BROOM_150, SPELL_MAGIC_BROOM_280); new spell_gen_mount("spell_headless_horseman_mount", 0, SPELL_HEADLESS_HORSEMAN_MOUNT_60, SPELL_HEADLESS_HORSEMAN_MOUNT_100, SPELL_HEADLESS_HORSEMAN_MOUNT_150, SPELL_HEADLESS_HORSEMAN_MOUNT_280); new spell_gen_mount("spell_winged_steed_of_the_ebon_blade", 0, 0, 0, SPELL_WINGED_STEED_150, SPELL_WINGED_STEED_280); @@ -3747,13 +3714,32 @@ void AddSC_generic_spell_scripts() new spell_gen_mount("spell_blazing_hippogryph", 0, 0, 0, SPELL_BLAZING_HIPPOGRYPH_150, SPELL_BLAZING_HIPPOGRYPH_280); new spell_gen_mount("spell_celestial_steed", 0, SPELL_CELESTIAL_STEED_60, SPELL_CELESTIAL_STEED_100, SPELL_CELESTIAL_STEED_150, SPELL_CELESTIAL_STEED_280, SPELL_CELESTIAL_STEED_310); new spell_gen_mount("spell_x53_touring_rocket", 0, 0, 0, SPELL_X53_TOURING_ROCKET_150, SPELL_X53_TOURING_ROCKET_280, SPELL_X53_TOURING_ROCKET_310); - new spell_gen_upper_deck_create_foam_sword(); - new spell_gen_bonked(); - new spell_gen_gift_of_naaru(); - new spell_gen_replenishment(); - new spell_gen_aura_service_uniform(); + new spell_gen_mounted_charge(); + new spell_gen_netherbloom(); + new spell_gen_nightmare_vine(); + new spell_gen_obsidian_armor(); + new spell_gen_on_tournament_mount(); + new spell_gen_oracle_wolvar_reputation(); new spell_gen_orc_disguise(); - new spell_gen_whisper_gulch_yogg_saron_whisper(); + new spell_gen_parachute(); + new spell_gen_parachute_ic(); + new spell_gen_pet_summoned(); + new spell_gen_profession_research(); + new spell_gen_remove_flight_auras(); + new spell_gen_replenishment(); + new spell_gen_seaforium_blast(); new spell_gen_spectator_cheer_trigger(); + new spell_gen_spirit_healer_res(); + new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL); + new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL); + new spell_gen_summon_tournament_mount(); + new spell_gen_tournament_duel(); + new spell_gen_tournament_pennant(); + new spell_pvp_trinket_wotf_shared_cd(); + new spell_gen_turkey_marker(); + new spell_gen_upper_deck_create_foam_sword(); + new spell_gen_vehicle_scaling(); new spell_gen_vendor_bark_trigger(); + new spell_gen_wg_water(); + new spell_gen_whisper_gulch_yogg_saron_whisper(); } diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 779308954d0..87533fbe47d 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -1309,41 +1309,41 @@ public: void AddSC_go_scripts() { - new go_cat_figurine; - new go_barov_journal; - new go_field_repair_bot_74A; - new go_gilded_brazier; - new go_orb_of_command; - new go_shrine_of_the_birds; - new go_southfury_moonstone; - new go_tablet_of_madness; - new go_tablet_of_the_seven; - new go_jump_a_tron; - new go_ethereum_prison; - new go_ethereum_stasis; - new go_resonite_cask; - new go_sacred_fire_of_life; - new go_tele_to_dalaran_crystal; - new go_tele_to_violet_stand; - new go_fel_crystalforge; - new go_bashir_crystalforge; - new go_matrix_punchograph; - new go_scourge_cage; - new go_arcane_prison; - new go_blood_filled_orb; - new go_jotunheim_cage; - new go_table_theka; - new go_inconspicuous_landmark; - new go_ethereal_teleport_pad; - new go_soulwell; - new go_tadpole_cage; - new go_dragonflayer_cage; - new go_amberpine_outhouse; - new go_hive_pod; - new go_massive_seaforium_charge; - new go_gjalerbron_cage; - new go_large_gjalerbron_cage; - new go_veil_skith_cage; - new go_frostblade_shrine; - new go_midsummer_bonfire; + new go_cat_figurine(); + new go_barov_journal(); + new go_field_repair_bot_74A(); + new go_gilded_brazier(); + new go_orb_of_command(); + new go_shrine_of_the_birds(); + new go_southfury_moonstone(); + new go_tablet_of_madness(); + new go_tablet_of_the_seven(); + new go_jump_a_tron(); + new go_ethereum_prison(); + new go_ethereum_stasis(); + new go_resonite_cask(); + new go_sacred_fire_of_life(); + new go_tele_to_dalaran_crystal(); + new go_tele_to_violet_stand(); + new go_fel_crystalforge(); + new go_bashir_crystalforge(); + new go_matrix_punchograph(); + new go_scourge_cage(); + new go_arcane_prison(); + new go_blood_filled_orb(); + new go_jotunheim_cage(); + new go_table_theka(); + new go_inconspicuous_landmark(); + new go_ethereal_teleport_pad(); + new go_soulwell(); + new go_tadpole_cage(); + new go_dragonflayer_cage(); + new go_amberpine_outhouse(); + new go_hive_pod(); + new go_massive_seaforium_charge(); + new go_gjalerbron_cage(); + new go_large_gjalerbron_cage(); + new go_veil_skith_cage(); + new go_frostblade_shrine(); + new go_midsummer_bonfire(); } |