PageRenderTime 67ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/src/server/scripts/Spells/spell_generic.cpp

https://gitlab.com/tkrokli/TrinityCore_434
C++ | 4156 lines | 3424 code | 585 blank | 147 comment | 325 complexity | 85ae9a833aac52d19732228c4733c1ef MD5 | raw file
Possible License(s): GPL-2.0, BSD-2-Clause
  1. /*
  2. * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License as published by the
  6. * Free Software Foundation; either version 2 of the License, or (at your
  7. * option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along
  15. * with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*
  18. * Scripts for spells with SPELLFAMILY_GENERIC which cannot be included in AI script file
  19. * of creature using it or can't be bound to any player class.
  20. * Ordered alphabetically using scriptname.
  21. * Scriptnames of files in this file should be prefixed with "spell_gen_"
  22. */
  23. #include "ScriptMgr.h"
  24. #include "Battleground.h"
  25. #include "Cell.h"
  26. #include "CellImpl.h"
  27. #include "GridNotifiers.h"
  28. #include "GridNotifiersImpl.h"
  29. #include "Group.h"
  30. #include "InstanceScript.h"
  31. #include "LFGMgr.h"
  32. #include "Pet.h"
  33. #include "ReputationMgr.h"
  34. #include "SkillDiscovery.h"
  35. #include "SpellHistory.h"
  36. #include "SpellScript.h"
  37. #include "SpellAuraEffects.h"
  38. #include "Vehicle.h"
  39. class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
  40. {
  41. public:
  42. spell_gen_absorb0_hitlimit1() : SpellScriptLoader("spell_gen_absorb0_hitlimit1") { }
  43. class spell_gen_absorb0_hitlimit1_AuraScript : public AuraScript
  44. {
  45. PrepareAuraScript(spell_gen_absorb0_hitlimit1_AuraScript);
  46. public:
  47. spell_gen_absorb0_hitlimit1_AuraScript()
  48. {
  49. limit = 0;
  50. }
  51. private:
  52. uint32 limit;
  53. bool Load() override
  54. {
  55. // Max absorb stored in 1 dummy effect
  56. limit = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
  57. return true;
  58. }
  59. void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
  60. {
  61. absorbAmount = std::min(limit, absorbAmount);
  62. }
  63. void Register() override
  64. {
  65. OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0);
  66. }
  67. };
  68. AuraScript* GetAuraScript() const override
  69. {
  70. return new spell_gen_absorb0_hitlimit1_AuraScript();
  71. }
  72. };
  73. // 28764 - Adaptive Warding (Frostfire Regalia Set)
  74. enum AdaptiveWarding
  75. {
  76. SPELL_GEN_ADAPTIVE_WARDING_FIRE = 28765,
  77. SPELL_GEN_ADAPTIVE_WARDING_NATURE = 28768,
  78. SPELL_GEN_ADAPTIVE_WARDING_FROST = 28766,
  79. SPELL_GEN_ADAPTIVE_WARDING_SHADOW = 28769,
  80. SPELL_GEN_ADAPTIVE_WARDING_ARCANE = 28770
  81. };
  82. class spell_gen_adaptive_warding : public SpellScriptLoader
  83. {
  84. public:
  85. spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { }
  86. class spell_gen_adaptive_warding_AuraScript : public AuraScript
  87. {
  88. PrepareAuraScript(spell_gen_adaptive_warding_AuraScript);
  89. bool Validate(SpellInfo const* /*spellInfo*/) override
  90. {
  91. if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) ||
  92. !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) ||
  93. !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) ||
  94. !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) ||
  95. !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE))
  96. return false;
  97. return true;
  98. }
  99. bool CheckProc(ProcEventInfo& eventInfo)
  100. {
  101. if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
  102. return false;
  103. // find Mage Armor
  104. if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0))
  105. return false;
  106. switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
  107. {
  108. case SPELL_SCHOOL_NORMAL:
  109. case SPELL_SCHOOL_HOLY:
  110. return false;
  111. default:
  112. break;
  113. }
  114. return true;
  115. }
  116. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  117. {
  118. PreventDefaultAction();
  119. uint32 spellId = 0;
  120. switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
  121. {
  122. case SPELL_SCHOOL_FIRE:
  123. spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE;
  124. break;
  125. case SPELL_SCHOOL_NATURE:
  126. spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE;
  127. break;
  128. case SPELL_SCHOOL_FROST:
  129. spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST;
  130. break;
  131. case SPELL_SCHOOL_SHADOW:
  132. spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW;
  133. break;
  134. case SPELL_SCHOOL_ARCANE:
  135. spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE;
  136. break;
  137. default:
  138. return;
  139. }
  140. GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
  141. }
  142. void Register() override
  143. {
  144. DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc);
  145. OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  146. }
  147. };
  148. AuraScript* GetAuraScript() const override
  149. {
  150. return new spell_gen_adaptive_warding_AuraScript();
  151. }
  152. };
  153. enum AlchemistStone
  154. {
  155. ALECHEMIST_STONE_HEAL = 21399,
  156. ALECHEMIST_STONE_MANA = 21400,
  157. };
  158. // 17619 - Alchemist Stone
  159. class spell_gen_alchemist_stone : public SpellScriptLoader
  160. {
  161. public:
  162. spell_gen_alchemist_stone() : SpellScriptLoader("spell_gen_alchemist_stone") { }
  163. class spell_gen_alchemist_stone_AuraScript : public AuraScript
  164. {
  165. PrepareAuraScript(spell_gen_alchemist_stone_AuraScript);
  166. bool Validate(SpellInfo const* /*spellInfo*/) override
  167. {
  168. if (!sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_HEAL) ||
  169. !sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_MANA))
  170. return false;
  171. return true;
  172. }
  173. bool CheckProc(ProcEventInfo& eventInfo)
  174. {
  175. return eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_POTION;
  176. }
  177. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  178. {
  179. PreventDefaultAction();
  180. uint32 spellId = 0;
  181. int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 0.4f);
  182. if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_HEAL))
  183. spellId = ALECHEMIST_STONE_HEAL;
  184. else if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_ENERGIZE))
  185. spellId = ALECHEMIST_STONE_MANA;
  186. if (!spellId)
  187. return;
  188. GetTarget()->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
  189. }
  190. void Register() override
  191. {
  192. DoCheckProc += AuraCheckProcFn(spell_gen_alchemist_stone_AuraScript::CheckProc);
  193. OnEffectProc += AuraEffectProcFn(spell_gen_alchemist_stone_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  194. }
  195. };
  196. AuraScript* GetAuraScript() const override
  197. {
  198. return new spell_gen_alchemist_stone_AuraScript();
  199. }
  200. };
  201. class spell_gen_allow_cast_from_item_only : public SpellScriptLoader
  202. {
  203. public:
  204. spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { }
  205. class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript
  206. {
  207. PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript);
  208. SpellCastResult CheckRequirement()
  209. {
  210. if (!GetCastItem())
  211. return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
  212. return SPELL_CAST_OK;
  213. }
  214. void Register() override
  215. {
  216. OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement);
  217. }
  218. };
  219. SpellScript* GetSpellScript() const override
  220. {
  221. return new spell_gen_allow_cast_from_item_only_SpellScript();
  222. }
  223. };
  224. enum AnimalBloodPoolSpell
  225. {
  226. SPELL_ANIMAL_BLOOD = 46221,
  227. SPELL_SPAWN_BLOOD_POOL = 63471
  228. };
  229. class spell_gen_animal_blood : public SpellScriptLoader
  230. {
  231. public:
  232. spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { }
  233. class spell_gen_animal_blood_AuraScript : public AuraScript
  234. {
  235. PrepareAuraScript(spell_gen_animal_blood_AuraScript);
  236. bool Validate(SpellInfo const* /*spellInfo*/) override
  237. {
  238. if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL))
  239. return false;
  240. return true;
  241. }
  242. void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  243. {
  244. // Remove all auras with spell id 46221, except the one currently being applied
  245. while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, ObjectGuid::Empty, ObjectGuid::Empty, 0, GetAura()))
  246. GetUnitOwner()->RemoveOwnedAura(aur);
  247. }
  248. void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  249. {
  250. if (Unit* owner = GetUnitOwner())
  251. if (owner->IsInWater())
  252. owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true);
  253. }
  254. void Register() override
  255. {
  256. AfterEffectApply += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
  257. AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
  258. }
  259. };
  260. AuraScript* GetAuraScript() const override
  261. {
  262. return new spell_gen_animal_blood_AuraScript();
  263. }
  264. };
  265. // 41337 Aura of Anger
  266. class spell_gen_aura_of_anger : public SpellScriptLoader
  267. {
  268. public:
  269. spell_gen_aura_of_anger() : SpellScriptLoader("spell_gen_aura_of_anger") { }
  270. class spell_gen_aura_of_anger_AuraScript : public AuraScript
  271. {
  272. PrepareAuraScript(spell_gen_aura_of_anger_AuraScript);
  273. void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
  274. {
  275. if (AuraEffect* aurEff1 = aurEff->GetBase()->GetEffect(EFFECT_1))
  276. aurEff1->ChangeAmount(aurEff1->GetAmount() + 5);
  277. aurEff->SetAmount(100 * aurEff->GetTickNumber());
  278. }
  279. void Register() override
  280. {
  281. OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_aura_of_anger_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
  282. }
  283. };
  284. AuraScript* GetAuraScript() const override
  285. {
  286. return new spell_gen_aura_of_anger_AuraScript();
  287. }
  288. };
  289. enum ServiceUniform
  290. {
  291. // Spells
  292. SPELL_SERVICE_UNIFORM = 71450,
  293. // Models
  294. MODEL_GOBLIN_MALE = 31002,
  295. MODEL_GOBLIN_FEMALE = 31003
  296. };
  297. class spell_gen_aura_service_uniform : public SpellScriptLoader
  298. {
  299. public:
  300. spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { }
  301. class spell_gen_aura_service_uniform_AuraScript : public AuraScript
  302. {
  303. PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript);
  304. bool Validate(SpellInfo const* /*spellInfo*/) override
  305. {
  306. if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM))
  307. return false;
  308. return true;
  309. }
  310. void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  311. {
  312. // Apply model goblin
  313. Unit* target = GetTarget();
  314. if (target->GetTypeId() == TYPEID_PLAYER)
  315. {
  316. if (target->getGender() == GENDER_MALE)
  317. target->SetDisplayId(MODEL_GOBLIN_MALE);
  318. else
  319. target->SetDisplayId(MODEL_GOBLIN_FEMALE);
  320. }
  321. }
  322. void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  323. {
  324. Unit* target = GetTarget();
  325. if (target->GetTypeId() == TYPEID_PLAYER)
  326. target->RestoreDisplayId();
  327. }
  328. void Register() override
  329. {
  330. AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
  331. AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
  332. }
  333. };
  334. AuraScript* GetAuraScript() const override
  335. {
  336. return new spell_gen_aura_service_uniform_AuraScript();
  337. }
  338. };
  339. class spell_gen_av_drekthar_presence : public SpellScriptLoader
  340. {
  341. public:
  342. spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { }
  343. class spell_gen_av_drekthar_presence_AuraScript : public AuraScript
  344. {
  345. PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript);
  346. bool CheckAreaTarget(Unit* target)
  347. {
  348. switch (target->GetEntry())
  349. {
  350. // alliance
  351. case 14762: // Dun Baldar North Marshal
  352. case 14763: // Dun Baldar South Marshal
  353. case 14764: // Icewing Marshal
  354. case 14765: // Stonehearth Marshal
  355. case 11948: // Vandar Stormspike
  356. // horde
  357. case 14772: // East Frostwolf Warmaster
  358. case 14776: // Tower Point Warmaster
  359. case 14773: // Iceblood Warmaster
  360. case 14777: // West Frostwolf Warmaster
  361. case 11946: // Drek'thar
  362. return true;
  363. default:
  364. return false;
  365. }
  366. }
  367. void Register() override
  368. {
  369. DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget);
  370. }
  371. };
  372. AuraScript* GetAuraScript() const override
  373. {
  374. return new spell_gen_av_drekthar_presence_AuraScript();
  375. }
  376. };
  377. enum GenericBandage
  378. {
  379. SPELL_RECENTLY_BANDAGED = 11196
  380. };
  381. class spell_gen_bandage : public SpellScriptLoader
  382. {
  383. public:
  384. spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { }
  385. class spell_gen_bandage_SpellScript : public SpellScript
  386. {
  387. PrepareSpellScript(spell_gen_bandage_SpellScript);
  388. bool Validate(SpellInfo const* /*spellInfo*/) override
  389. {
  390. if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED))
  391. return false;
  392. return true;
  393. }
  394. SpellCastResult CheckCast()
  395. {
  396. if (Unit* target = GetExplTargetUnit())
  397. {
  398. if (target->HasAura(SPELL_RECENTLY_BANDAGED))
  399. return SPELL_FAILED_TARGET_AURASTATE;
  400. }
  401. return SPELL_CAST_OK;
  402. }
  403. void HandleScript()
  404. {
  405. if (Unit* target = GetHitUnit())
  406. GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true);
  407. }
  408. void Register() override
  409. {
  410. OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast);
  411. AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript);
  412. }
  413. };
  414. SpellScript* GetSpellScript() const override
  415. {
  416. return new spell_gen_bandage_SpellScript();
  417. }
  418. };
  419. enum Bonked
  420. {
  421. SPELL_BONKED = 62991,
  422. SPELL_FOAM_SWORD_DEFEAT = 62994,
  423. SPELL_ON_GUARD = 62972
  424. };
  425. class spell_gen_bonked : public SpellScriptLoader
  426. {
  427. public:
  428. spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { }
  429. class spell_gen_bonked_SpellScript : public SpellScript
  430. {
  431. PrepareSpellScript(spell_gen_bonked_SpellScript);
  432. void HandleScript(SpellEffIndex /*effIndex*/)
  433. {
  434. if (Player* target = GetHitPlayer())
  435. {
  436. Aura const* aura = GetHitAura();
  437. if (!(aura && aura->GetStackAmount() == 3))
  438. return;
  439. target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true);
  440. target->RemoveAurasDueToSpell(SPELL_BONKED);
  441. if (Aura const* auraOnGuard = target->GetAura(SPELL_ON_GUARD))
  442. {
  443. if (Item* item = target->GetItemByGuid(auraOnGuard->GetCastItemGUID()))
  444. target->DestroyItemCount(item->GetEntry(), 1, true);
  445. }
  446. }
  447. }
  448. void Register() override
  449. {
  450. OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
  451. }
  452. };
  453. SpellScript* GetSpellScript() const override
  454. {
  455. return new spell_gen_bonked_SpellScript();
  456. }
  457. };
  458. /* DOCUMENTATION: Break-Shield spells
  459. Break-Shield spells can be classified in three groups:
  460. - Spells on vehicle bar used by players:
  461. + EFFECT_0: SCRIPT_EFFECT
  462. + EFFECT_1: NONE
  463. + EFFECT_2: NONE
  464. - Spells cast by players triggered by script:
  465. + EFFECT_0: SCHOOL_DAMAGE
  466. + EFFECT_1: SCRIPT_EFFECT
  467. + EFFECT_2: FORCE_CAST
  468. - Spells cast by NPCs on players:
  469. + EFFECT_0: SCHOOL_DAMAGE
  470. + EFFECT_1: SCRIPT_EFFECT
  471. + EFFECT_2: NONE
  472. In the following script we handle the SCRIPT_EFFECT for effIndex EFFECT_0 and EFFECT_1.
  473. - When handling EFFECT_0 we're in the "Spells on vehicle bar used by players" case
  474. and we'll trigger "Spells cast by players triggered by script"
  475. - When handling EFFECT_1 we're in the "Spells cast by players triggered by script"
  476. or "Spells cast by NPCs on players" so we'll search for the first defend layer and drop it.
  477. */
  478. enum BreakShieldSpells
  479. {
  480. SPELL_BREAK_SHIELD_DAMAGE_2K = 62626,
  481. SPELL_BREAK_SHIELD_DAMAGE_10K = 64590,
  482. SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS = 62575, // Also on ToC5 mounts
  483. SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE = 64595,
  484. SPELL_BREAK_SHIELD_TRIGGER_UNK = 66480
  485. };
  486. class spell_gen_break_shield: public SpellScriptLoader
  487. {
  488. public:
  489. spell_gen_break_shield(const char* name) : SpellScriptLoader(name) { }
  490. class spell_gen_break_shield_SpellScript : public SpellScript
  491. {
  492. PrepareSpellScript(spell_gen_break_shield_SpellScript);
  493. void HandleScriptEffect(SpellEffIndex effIndex)
  494. {
  495. Unit* target = GetHitUnit();
  496. switch (effIndex)
  497. {
  498. case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual)
  499. {
  500. uint32 spellId;
  501. switch (GetSpellInfo()->Id)
  502. {
  503. case SPELL_BREAK_SHIELD_TRIGGER_UNK:
  504. case SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE:
  505. spellId = SPELL_BREAK_SHIELD_DAMAGE_10K;
  506. break;
  507. case SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS:
  508. spellId = SPELL_BREAK_SHIELD_DAMAGE_2K;
  509. break;
  510. default:
  511. return;
  512. }
  513. if (Unit* rider = GetCaster()->GetCharmer())
  514. rider->CastSpell(target, spellId, false);
  515. else
  516. GetCaster()->CastSpell(target, spellId, false);
  517. break;
  518. }
  519. case EFFECT_1: // On damaging spells, for removing a defend layer
  520. {
  521. Unit::AuraApplicationMap const& auras = target->GetAppliedAuras();
  522. for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
  523. {
  524. if (Aura* aura = itr->second->GetBase())
  525. {
  526. SpellInfo const* auraInfo = aura->GetSpellInfo();
  527. if (auraInfo && auraInfo->SpellIconID == 2007 && aura->HasEffectType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN))
  528. {
  529. aura->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
  530. // Remove dummys from rider (Necessary for updating visual shields)
  531. if (Unit* rider = target->GetCharmer())
  532. if (Aura* defend = rider->GetAura(aura->GetId()))
  533. defend->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
  534. break;
  535. }
  536. }
  537. }
  538. break;
  539. }
  540. default:
  541. break;
  542. }
  543. }
  544. void Register() override
  545. {
  546. OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT);
  547. }
  548. };
  549. SpellScript* GetSpellScript() const override
  550. {
  551. return new spell_gen_break_shield_SpellScript();
  552. }
  553. };
  554. // 46394 Brutallus Burn
  555. class spell_gen_burn_brutallus : public SpellScriptLoader
  556. {
  557. public:
  558. spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { }
  559. class spell_gen_burn_brutallus_AuraScript : public AuraScript
  560. {
  561. PrepareAuraScript(spell_gen_burn_brutallus_AuraScript);
  562. void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
  563. {
  564. if (aurEff->GetTickNumber() % 11 == 0)
  565. aurEff->SetAmount(aurEff->GetAmount() * 2);
  566. }
  567. void Register() override
  568. {
  569. OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
  570. }
  571. };
  572. AuraScript* GetAuraScript() const override
  573. {
  574. return new spell_gen_burn_brutallus_AuraScript();
  575. }
  576. };
  577. enum CannibalizeSpells
  578. {
  579. SPELL_CANNIBALIZE_TRIGGERED = 20578
  580. };
  581. class spell_gen_cannibalize : public SpellScriptLoader
  582. {
  583. public:
  584. spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { }
  585. class spell_gen_cannibalize_SpellScript : public SpellScript
  586. {
  587. PrepareSpellScript(spell_gen_cannibalize_SpellScript);
  588. bool Validate(SpellInfo const* /*spellInfo*/) override
  589. {
  590. if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED))
  591. return false;
  592. return true;
  593. }
  594. SpellCastResult CheckIfCorpseNear()
  595. {
  596. Unit* caster = GetCaster();
  597. float max_range = GetSpellInfo()->GetMaxRange(false);
  598. WorldObject* result = NULL;
  599. // search for nearby enemy corpse in range
  600. Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY);
  601. Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
  602. caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
  603. if (!result)
  604. return SPELL_FAILED_NO_EDIBLE_CORPSES;
  605. return SPELL_CAST_OK;
  606. }
  607. void HandleDummy(SpellEffIndex /*effIndex*/)
  608. {
  609. GetCaster()->CastSpell(GetCaster(), SPELL_CANNIBALIZE_TRIGGERED, false);
  610. }
  611. void Register() override
  612. {
  613. OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  614. OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear);
  615. }
  616. };
  617. SpellScript* GetSpellScript() const override
  618. {
  619. return new spell_gen_cannibalize_SpellScript();
  620. }
  621. };
  622. enum ChaosBlast
  623. {
  624. SPELL_CHAOS_BLAST = 37675
  625. };
  626. class spell_gen_chaos_blast : public SpellScriptLoader
  627. {
  628. public:
  629. spell_gen_chaos_blast() : SpellScriptLoader("spell_gen_chaos_blast") { }
  630. class spell_gen_chaos_blast_SpellScript : public SpellScript
  631. {
  632. PrepareSpellScript(spell_gen_chaos_blast_SpellScript);
  633. bool Validate(SpellInfo const* /*spellInfo*/) override
  634. {
  635. if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST))
  636. return false;
  637. return true;
  638. }
  639. void HandleDummy(SpellEffIndex /* effIndex */)
  640. {
  641. int32 basepoints0 = 100;
  642. Unit* caster = GetCaster();
  643. if (Unit* target = GetHitUnit())
  644. caster->CastCustomSpell(target, SPELL_CHAOS_BLAST, &basepoints0, NULL, NULL, true);
  645. }
  646. void Register() override
  647. {
  648. OnEffectHitTarget += SpellEffectFn(spell_gen_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  649. }
  650. };
  651. SpellScript* GetSpellScript() const override
  652. {
  653. return new spell_gen_chaos_blast_SpellScript();
  654. }
  655. };
  656. enum Clone
  657. {
  658. SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE = 57528
  659. };
  660. class spell_gen_clone : public SpellScriptLoader
  661. {
  662. public:
  663. spell_gen_clone() : SpellScriptLoader("spell_gen_clone") { }
  664. class spell_gen_clone_SpellScript : public SpellScript
  665. {
  666. PrepareSpellScript(spell_gen_clone_SpellScript);
  667. void HandleScriptEffect(SpellEffIndex effIndex)
  668. {
  669. PreventHitDefaultEffect(effIndex);
  670. GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
  671. }
  672. void Register() override
  673. {
  674. if (m_scriptSpellId == SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE)
  675. {
  676. OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_DUMMY);
  677. OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_DUMMY);
  678. }
  679. else
  680. {
  681. OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
  682. OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
  683. }
  684. }
  685. };
  686. SpellScript* GetSpellScript() const override
  687. {
  688. return new spell_gen_clone_SpellScript();
  689. }
  690. };
  691. enum CloneWeaponSpells
  692. {
  693. SPELL_COPY_WEAPON_AURA = 41054,
  694. SPELL_COPY_WEAPON_2_AURA = 63418,
  695. SPELL_COPY_WEAPON_3_AURA = 69893,
  696. SPELL_COPY_OFFHAND_AURA = 45205,
  697. SPELL_COPY_OFFHAND_2_AURA = 69896,
  698. SPELL_COPY_RANGED_AURA = 57594
  699. };
  700. class spell_gen_clone_weapon : public SpellScriptLoader
  701. {
  702. public:
  703. spell_gen_clone_weapon() : SpellScriptLoader("spell_gen_clone_weapon") { }
  704. class spell_gen_clone_weapon_SpellScript : public SpellScript
  705. {
  706. PrepareSpellScript(spell_gen_clone_weapon_SpellScript);
  707. void HandleScriptEffect(SpellEffIndex effIndex)
  708. {
  709. PreventHitDefaultEffect(effIndex);
  710. GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
  711. }
  712. void Register() override
  713. {
  714. OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  715. }
  716. };
  717. SpellScript* GetSpellScript() const override
  718. {
  719. return new spell_gen_clone_weapon_SpellScript();
  720. }
  721. };
  722. class spell_gen_clone_weapon_aura : public SpellScriptLoader
  723. {
  724. public:
  725. spell_gen_clone_weapon_aura() : SpellScriptLoader("spell_gen_clone_weapon_aura") { }
  726. class spell_gen_clone_weapon_auraScript : public AuraScript
  727. {
  728. PrepareAuraScript(spell_gen_clone_weapon_auraScript);
  729. public:
  730. spell_gen_clone_weapon_auraScript()
  731. {
  732. prevItem = 0;
  733. }
  734. private:
  735. bool Validate(SpellInfo const* /*spellInfo*/) override
  736. {
  737. if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) ||
  738. !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) ||
  739. !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_3_AURA) ||
  740. !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_AURA) ||
  741. !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_2_AURA) ||
  742. !sSpellMgr->GetSpellInfo(SPELL_COPY_RANGED_AURA))
  743. return false;
  744. return true;
  745. }
  746. void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  747. {
  748. Unit* caster = GetCaster();
  749. Unit* target = GetTarget();
  750. if (!caster)
  751. return;
  752. switch (GetSpellInfo()->Id)
  753. {
  754. case SPELL_COPY_WEAPON_AURA:
  755. case SPELL_COPY_WEAPON_2_AURA:
  756. case SPELL_COPY_WEAPON_3_AURA:
  757. {
  758. prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID);
  759. if (Player* player = caster->ToPlayer())
  760. {
  761. if (Item* mainItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
  762. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, mainItem->GetEntry());
  763. }
  764. else
  765. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID));
  766. break;
  767. }
  768. case SPELL_COPY_OFFHAND_AURA:
  769. case SPELL_COPY_OFFHAND_2_AURA:
  770. {
  771. prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 1;
  772. if (Player* player = caster->ToPlayer())
  773. {
  774. if (Item* offItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
  775. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, offItem->GetEntry());
  776. }
  777. else
  778. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1));
  779. break;
  780. }
  781. case SPELL_COPY_RANGED_AURA:
  782. {
  783. prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 2;
  784. if (Player* player = caster->ToPlayer())
  785. {
  786. if (Item* rangedItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
  787. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, rangedItem->GetEntry());
  788. }
  789. else
  790. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2));
  791. break;
  792. }
  793. default:
  794. break;
  795. }
  796. }
  797. void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  798. {
  799. Unit* target = GetTarget();
  800. switch (GetSpellInfo()->Id)
  801. {
  802. case SPELL_COPY_WEAPON_AURA:
  803. case SPELL_COPY_WEAPON_2_AURA:
  804. case SPELL_COPY_WEAPON_3_AURA:
  805. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem);
  806. break;
  807. case SPELL_COPY_OFFHAND_AURA:
  808. case SPELL_COPY_OFFHAND_2_AURA:
  809. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem);
  810. break;
  811. case SPELL_COPY_RANGED_AURA:
  812. target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem);
  813. break;
  814. default:
  815. break;
  816. }
  817. }
  818. void Register() override
  819. {
  820. OnEffectApply += AuraEffectApplyFn(spell_gen_clone_weapon_auraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  821. OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_auraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  822. }
  823. private:
  824. uint32 prevItem;
  825. };
  826. AuraScript* GetAuraScript() const override
  827. {
  828. return new spell_gen_clone_weapon_auraScript();
  829. }
  830. };
  831. class spell_gen_count_pct_from_max_hp : public SpellScriptLoader
  832. {
  833. public:
  834. spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { }
  835. class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript
  836. {
  837. PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript);
  838. public:
  839. spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { }
  840. void RecalculateDamage()
  841. {
  842. if (!_damagePct)
  843. _damagePct = GetHitDamage();
  844. SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct));
  845. }
  846. void Register() override
  847. {
  848. OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage);
  849. }
  850. private:
  851. int32 _damagePct;
  852. };
  853. SpellScript* GetSpellScript() const override
  854. {
  855. return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct);
  856. }
  857. private:
  858. int32 _damagePct;
  859. };
  860. // 63845 - Create Lance
  861. enum CreateLanceSpells
  862. {
  863. SPELL_CREATE_LANCE_ALLIANCE = 63914,
  864. SPELL_CREATE_LANCE_HORDE = 63919
  865. };
  866. class spell_gen_create_lance : public SpellScriptLoader
  867. {
  868. public:
  869. spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { }
  870. class spell_gen_create_lance_SpellScript : public SpellScript
  871. {
  872. PrepareSpellScript(spell_gen_create_lance_SpellScript);
  873. bool Validate(SpellInfo const* /*spellInfo*/) override
  874. {
  875. if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) ||
  876. !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE))
  877. return false;
  878. return true;
  879. }
  880. void HandleScript(SpellEffIndex effIndex)
  881. {
  882. PreventHitDefaultEffect(effIndex);
  883. if (Player* target = GetHitPlayer())
  884. {
  885. if (target->GetTeam() == ALLIANCE)
  886. GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true);
  887. else
  888. GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true);
  889. }
  890. }
  891. void Register() override
  892. {
  893. OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  894. }
  895. };
  896. SpellScript* GetSpellScript() const override
  897. {
  898. return new spell_gen_create_lance_SpellScript();
  899. }
  900. };
  901. class spell_gen_creature_permanent_feign_death : public SpellScriptLoader
  902. {
  903. public:
  904. spell_gen_creature_permanent_feign_death() : SpellScriptLoader("spell_gen_creature_permanent_feign_death") { }
  905. class spell_gen_creature_permanent_feign_death_AuraScript : public AuraScript
  906. {
  907. PrepareAuraScript(spell_gen_creature_permanent_feign_death_AuraScript);
  908. void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  909. {
  910. Unit* target = GetTarget();
  911. target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
  912. target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
  913. if (target->GetTypeId() == TYPEID_UNIT)
  914. target->ToCreature()->SetReactState(REACT_PASSIVE);
  915. }
  916. void Register() override
  917. {
  918. OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  919. }
  920. };
  921. AuraScript* GetAuraScript() const override
  922. {
  923. return new spell_gen_creature_permanent_feign_death_AuraScript();
  924. }
  925. };
  926. enum DalaranDisguiseSpells
  927. {
  928. SPELL_SUNREAVER_DISGUISE_TRIGGER = 69672,
  929. SPELL_SUNREAVER_DISGUISE_FEMALE = 70973,
  930. SPELL_SUNREAVER_DISGUISE_MALE = 70974,
  931. SPELL_SILVER_COVENANT_DISGUISE_TRIGGER = 69673,
  932. SPELL_SILVER_COVENANT_DISGUISE_FEMALE = 70971,
  933. SPELL_SILVER_COVENANT_DISGUISE_MALE = 70972
  934. };
  935. class spell_gen_dalaran_disguise : public SpellScriptLoader
  936. {
  937. public:
  938. spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) { }
  939. class spell_gen_dalaran_disguise_SpellScript : public SpellScript
  940. {
  941. PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript);
  942. bool Validate(SpellInfo const* spellInfo) override
  943. {
  944. switch (spellInfo->Id)
  945. {
  946. case SPELL_SUNREAVER_DISGUISE_TRIGGER:
  947. if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) ||
  948. !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE))
  949. return false;
  950. break;
  951. case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
  952. if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) ||
  953. !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE))
  954. return false;
  955. break;
  956. }
  957. return true;
  958. }
  959. void HandleScript(SpellEffIndex /*effIndex*/)
  960. {
  961. if (Player* player = GetHitPlayer())
  962. {
  963. uint8 gender = player->getGender();
  964. uint32 spellId = GetSpellInfo()->Id;
  965. switch (spellId)
  966. {
  967. case SPELL_SUNREAVER_DISGUISE_TRIGGER:
  968. spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE;
  969. break;
  970. case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
  971. spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE;
  972. break;
  973. default:
  974. break;
  975. }
  976. GetCaster()->CastSpell(player, spellId, true);
  977. }
  978. }
  979. void Register() override
  980. {
  981. OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  982. }
  983. };
  984. SpellScript* GetSpellScript() const override
  985. {
  986. return new spell_gen_dalaran_disguise_SpellScript();
  987. }
  988. };
  989. enum DefendVisuals
  990. {
  991. SPELL_VISUAL_SHIELD_1 = 63130,
  992. SPELL_VISUAL_SHIELD_2 = 63131,
  993. SPELL_VISUAL_SHIELD_3 = 63132
  994. };
  995. class spell_gen_defend : public SpellScriptLoader
  996. {
  997. public:
  998. spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { }
  999. class spell_gen_defend_AuraScript : public AuraScript
  1000. {
  1001. PrepareAuraScript(spell_gen_defend_AuraScript);
  1002. bool Validate(SpellInfo const* /*spellInfo*/) override
  1003. {
  1004. if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1))
  1005. return false;
  1006. if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2))
  1007. return false;
  1008. if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3))
  1009. return false;
  1010. return true;
  1011. }
  1012. void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
  1013. {
  1014. if (GetCaster())
  1015. {
  1016. Unit* target = GetTarget();
  1017. for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i)
  1018. target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
  1019. target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff);
  1020. }
  1021. else
  1022. GetTarget()->RemoveAurasDueToSpell(GetId());
  1023. }
  1024. void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  1025. {
  1026. for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i)
  1027. GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
  1028. }
  1029. void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  1030. {
  1031. if (Unit* caster = GetCaster())
  1032. if (TempSummon* vehicle = caster->ToTempSummon())
  1033. if (Unit* rider = vehicle->GetSummoner())
  1034. rider->RemoveAurasDueToSpell(GetId());
  1035. }
  1036. void Register() override
  1037. {
  1038. SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(m_scriptSpellId);
  1039. // Defend spells cast by NPCs (add visuals)
  1040. if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
  1041. {
  1042. AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  1043. OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK);
  1044. }
  1045. // Remove Defend spell from player when he dismounts
  1046. if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
  1047. OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL);
  1048. // Defend spells cast by players (add/remove visuals)
  1049. if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY)
  1050. {
  1051. AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  1052. OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK);
  1053. }
  1054. }
  1055. };
  1056. AuraScript* GetAuraScript() const override
  1057. {
  1058. return new spell_gen_defend_AuraScript();
  1059. }
  1060. };
  1061. class spell_gen_despawn_self : public SpellScriptLoader
  1062. {
  1063. public:
  1064. spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { }
  1065. class spell_gen_despawn_self_SpellScript : public SpellScript
  1066. {
  1067. PrepareSpellScript(spell_gen_despawn_self_SpellScript);
  1068. bool Load() override
  1069. {
  1070. return GetCaster()->GetTypeId() == TYPEID_UNIT;
  1071. }
  1072. void HandleDummy(SpellEffIndex effIndex)
  1073. {
  1074. if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT)
  1075. GetCaster()->ToCreature()->DespawnOrUnsummon();
  1076. }
  1077. void Register() override
  1078. {
  1079. OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY);
  1080. }
  1081. };
  1082. SpellScript* GetSpellScript() const override
  1083. {
  1084. return new spell_gen_despawn_self_SpellScript();
  1085. }
  1086. };
  1087. enum DivineStormSpell
  1088. {
  1089. SPELL_DIVINE_STORM = 53385,
  1090. };
  1091. // 70769 Divine Storm!
  1092. class spell_gen_divine_storm_cd_reset : public SpellScriptLoader
  1093. {
  1094. public:
  1095. spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") { }
  1096. class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript
  1097. {
  1098. PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript);
  1099. bool Load() override
  1100. {
  1101. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  1102. }
  1103. bool Validate(SpellInfo const* /*spellInfo*/) override
  1104. {
  1105. if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM))
  1106. return false;
  1107. return true;
  1108. }
  1109. void HandleScript(SpellEffIndex /*effIndex*/)
  1110. {
  1111. Player* caster = GetCaster()->ToPlayer();
  1112. if (caster->GetSpellHistory()->HasCooldown(SPELL_DIVINE_STORM))
  1113. caster->GetSpellHistory()->ResetCooldown(SPELL_DIVINE_STORM, true);
  1114. }
  1115. void Register() override
  1116. {
  1117. OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
  1118. }
  1119. };
  1120. SpellScript* GetSpellScript() const override
  1121. {
  1122. return new spell_gen_divine_storm_cd_reset_SpellScript();
  1123. }
  1124. };
  1125. class spell_gen_ds_flush_knockback : public SpellScriptLoader
  1126. {
  1127. public:
  1128. spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") { }
  1129. class spell_gen_ds_flush_knockback_SpellScript : public SpellScript
  1130. {
  1131. PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript);
  1132. void HandleScript(SpellEffIndex /*effIndex*/)
  1133. {
  1134. // Here the target is the water spout and determines the position where the player is knocked from
  1135. if (Unit* target = GetHitUnit())
  1136. {
  1137. if (Player* player = GetCaster()->ToPlayer())
  1138. {
  1139. float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target));
  1140. float verticalSpeed = 8.0f;
  1141. // This method relies on the Dalaran Sewer map disposition and Water Spout position
  1142. // What we do is knock the player from a position exactly behind him and at the end of the pipe
  1143. player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed);
  1144. }
  1145. }
  1146. }
  1147. void Register() override
  1148. {
  1149. OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
  1150. }
  1151. };
  1152. SpellScript* GetSpellScript() const override
  1153. {
  1154. return new spell_gen_ds_flush_knockback_SpellScript();
  1155. }
  1156. };
  1157. enum DummyTrigger
  1158. {
  1159. SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470,
  1160. SPELL_PERSISTANT_SHIELD = 26467
  1161. };
  1162. class spell_gen_dummy_trigger : public SpellScriptLoader
  1163. {
  1164. public:
  1165. spell_gen_dummy_trigger() : SpellScriptLoader("spell_gen_dummy_trigger") { }
  1166. class spell_gen_dummy_trigger_SpellScript : public SpellScript
  1167. {
  1168. PrepareSpellScript(spell_gen_dummy_trigger_SpellScript);
  1169. bool Validate(SpellInfo const* /*spellInfo*/) override
  1170. {
  1171. if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) ||
  1172. !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD))
  1173. return false;
  1174. return true;
  1175. }
  1176. void HandleDummy(SpellEffIndex /* effIndex */)
  1177. {
  1178. int32 damage = GetEffectValue();
  1179. Unit* caster = GetCaster();
  1180. if (Unit* target = GetHitUnit())
  1181. if (SpellInfo const* triggeredByAuraSpell = GetTriggeringSpell())
  1182. if (triggeredByAuraSpell->Id == SPELL_PERSISTANT_SHIELD_TRIGGERED)
  1183. caster->CastCustomSpell(target, SPELL_PERSISTANT_SHIELD_TRIGGERED, &damage, NULL, NULL, true);
  1184. }
  1185. void Register() override
  1186. {
  1187. OnEffectHitTarget += SpellEffectFn(spell_gen_dummy_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  1188. }
  1189. };
  1190. SpellScript* GetSpellScript() const override
  1191. {
  1192. return new spell_gen_dummy_trigger_SpellScript();
  1193. }
  1194. };
  1195. class spell_gen_dungeon_credit : public SpellScriptLoader
  1196. {
  1197. public:
  1198. spell_gen_dungeon_credit() : SpellScriptLoader("spell_gen_dungeon_credit") { }
  1199. class spell_gen_dungeon_credit_SpellScript : public SpellScript
  1200. {
  1201. PrepareSpellScript(spell_gen_dungeon_credit_SpellScript);
  1202. public:
  1203. spell_gen_dungeon_credit_SpellScript()
  1204. {
  1205. _handled = false;
  1206. }
  1207. private:
  1208. bool Load() override
  1209. {
  1210. return GetCaster()->GetTypeId() == TYPEID_UNIT;
  1211. }
  1212. void CreditEncounter()
  1213. {
  1214. // This hook is executed for every target, make sure we only credit instance once
  1215. if (_handled)
  1216. return;
  1217. _handled = true;
  1218. Unit* caster = GetCaster();
  1219. if (InstanceScript* instance = caster->GetInstanceScript())
  1220. instance->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, GetSpellInfo()->Id, caster);
  1221. }
  1222. void Register() override
  1223. {
  1224. AfterHit += SpellHitFn(spell_gen_dungeon_credit_SpellScript::CreditEncounter);
  1225. }
  1226. private:
  1227. bool _handled;
  1228. };
  1229. SpellScript* GetSpellScript() const override
  1230. {
  1231. return new spell_gen_dungeon_credit_SpellScript();
  1232. }
  1233. };
  1234. enum EluneCandle
  1235. {
  1236. // Creatures
  1237. NPC_OMEN = 15467,
  1238. // Spells
  1239. SPELL_ELUNE_CANDLE_OMEN_HEAD = 26622,
  1240. SPELL_ELUNE_CANDLE_OMEN_CHEST = 26624,
  1241. SPELL_ELUNE_CANDLE_OMEN_HAND_R = 26625,
  1242. SPELL_ELUNE_CANDLE_OMEN_HAND_L = 26649,
  1243. SPELL_ELUNE_CANDLE_NORMAL = 26636
  1244. };
  1245. class spell_gen_elune_candle : public SpellScriptLoader
  1246. {
  1247. public:
  1248. spell_gen_elune_candle() : SpellScriptLoader("spell_gen_elune_candle") { }
  1249. class spell_gen_elune_candle_SpellScript : public SpellScript
  1250. {
  1251. PrepareSpellScript(spell_gen_elune_candle_SpellScript);
  1252. bool Validate(SpellInfo const* /*spellInfo*/) override
  1253. {
  1254. if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) ||
  1255. !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST) ||
  1256. !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_R) ||
  1257. !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_L) ||
  1258. !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_NORMAL))
  1259. return false;
  1260. return true;
  1261. }
  1262. void HandleScript(SpellEffIndex /*effIndex*/)
  1263. {
  1264. uint32 spellId = 0;
  1265. if (GetHitUnit()->GetEntry() == NPC_OMEN)
  1266. {
  1267. switch (urand(0, 3))
  1268. {
  1269. case 0:
  1270. spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD;
  1271. break;
  1272. case 1:
  1273. spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST;
  1274. break;
  1275. case 2:
  1276. spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R;
  1277. break;
  1278. case 3:
  1279. spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L;
  1280. break;
  1281. }
  1282. }
  1283. else
  1284. spellId = SPELL_ELUNE_CANDLE_NORMAL;
  1285. GetCaster()->CastSpell(GetHitUnit(), spellId, true, NULL);
  1286. }
  1287. void Register() override
  1288. {
  1289. OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
  1290. }
  1291. };
  1292. SpellScript* GetSpellScript() const override
  1293. {
  1294. return new spell_gen_elune_candle_SpellScript();
  1295. }
  1296. };
  1297. enum TransporterBackfires
  1298. {
  1299. SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH = 23444,
  1300. SPELL_TRANSPORTER_EVIL_TWIN = 23445,
  1301. SPELL_TRANSPORTER_MALFUNCTION_MISS = 36902
  1302. };
  1303. class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader
  1304. {
  1305. public:
  1306. spell_gen_gadgetzan_transporter_backfire() : SpellScriptLoader("spell_gen_gadgetzan_transporter_backfire") { }
  1307. class spell_gen_gadgetzan_transporter_backfire_SpellScript : public SpellScript
  1308. {
  1309. PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript);
  1310. bool Validate(SpellInfo const* /*spellInfo*/) override
  1311. {
  1312. if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) ||
  1313. !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) ||
  1314. !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_MISS))
  1315. return false;
  1316. return true;
  1317. }
  1318. void HandleDummy(SpellEffIndex /* effIndex */)
  1319. {
  1320. Unit* caster = GetCaster();
  1321. int32 r = irand(0, 119);
  1322. if (r < 20) // Transporter Malfunction - 1/6 polymorph
  1323. caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH, true);
  1324. else if (r < 100) // Evil Twin - 4/6 evil twin
  1325. caster->CastSpell(caster, SPELL_TRANSPORTER_EVIL_TWIN, true);
  1326. else // Transporter Malfunction - 1/6 miss the target
  1327. caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_MISS, true);
  1328. }
  1329. void Register() override
  1330. {
  1331. OnEffectHitTarget += SpellEffectFn(spell_gen_gadgetzan_transporter_backfire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  1332. }
  1333. };
  1334. SpellScript* GetSpellScript() const override
  1335. {
  1336. return new spell_gen_gadgetzan_transporter_backfire_SpellScript();
  1337. }
  1338. };
  1339. class spell_gen_gift_of_naaru : public SpellScriptLoader
  1340. {
  1341. public:
  1342. spell_gen_gift_of_naaru() : SpellScriptLoader("spell_gen_gift_of_naaru") { }
  1343. class spell_gen_gift_of_naaru_AuraScript : public AuraScript
  1344. {
  1345. PrepareAuraScript(spell_gen_gift_of_naaru_AuraScript);
  1346. void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
  1347. {
  1348. if (!GetCaster())
  1349. return;
  1350. float heal = 0.0f;
  1351. switch (GetSpellInfo()->SpellFamilyName)
  1352. {
  1353. case SPELLFAMILY_MAGE:
  1354. case SPELLFAMILY_WARLOCK:
  1355. case SPELLFAMILY_PRIEST:
  1356. heal = 1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()));
  1357. break;
  1358. case SPELLFAMILY_PALADIN:
  1359. case SPELLFAMILY_SHAMAN:
  1360. heal = std::max(1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())), 1.1f * float(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)));
  1361. break;
  1362. case SPELLFAMILY_WARRIOR:
  1363. case SPELLFAMILY_HUNTER:
  1364. case SPELLFAMILY_DEATHKNIGHT:
  1365. heal = 1.1f * float(std::max(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetCaster()->GetTotalAttackPowerValue(RANGED_ATTACK)));
  1366. break;
  1367. case SPELLFAMILY_GENERIC:
  1368. default:
  1369. break;
  1370. }
  1371. int32 healTick = std::floor(heal / aurEff->GetTotalTicks());
  1372. amount += int32(std::max(healTick, 0));
  1373. }
  1374. void Register() override
  1375. {
  1376. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
  1377. }
  1378. };
  1379. AuraScript* GetAuraScript() const override
  1380. {
  1381. return new spell_gen_gift_of_naaru_AuraScript();
  1382. }
  1383. };
  1384. enum GnomishTransporter
  1385. {
  1386. SPELL_TRANSPORTER_SUCCESS = 23441,
  1387. SPELL_TRANSPORTER_FAILURE = 23446
  1388. };
  1389. class spell_gen_gnomish_transporter : public SpellScriptLoader
  1390. {
  1391. public:
  1392. spell_gen_gnomish_transporter() : SpellScriptLoader("spell_gen_gnomish_transporter") { }
  1393. class spell_gen_gnomish_transporter_SpellScript : public SpellScript
  1394. {
  1395. PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript);
  1396. bool Validate(SpellInfo const* /*spellInfo*/) override
  1397. {
  1398. if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) ||
  1399. !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE))
  1400. return false;
  1401. return true;
  1402. }
  1403. void HandleDummy(SpellEffIndex /* effIndex */)
  1404. {
  1405. GetCaster()->CastSpell(GetCaster(), roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true);
  1406. }
  1407. void Register() override
  1408. {
  1409. OnEffectHitTarget += SpellEffectFn(spell_gen_gnomish_transporter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  1410. }
  1411. };
  1412. SpellScript* GetSpellScript() const override
  1413. {
  1414. return new spell_gen_gnomish_transporter_SpellScript();
  1415. }
  1416. };
  1417. enum Interrupt
  1418. {
  1419. SPELL_GEN_THROW_INTERRUPT = 32747
  1420. };
  1421. // 32748 - Deadly Throw Interrupt
  1422. // 44835 - Maim Interrupt
  1423. class spell_gen_interrupt : public SpellScriptLoader
  1424. {
  1425. public:
  1426. spell_gen_interrupt() : SpellScriptLoader("spell_gen_interrupt") { }
  1427. class spell_gen_interrupt_AuraScript : public AuraScript
  1428. {
  1429. PrepareAuraScript(spell_gen_interrupt_AuraScript);
  1430. bool Validate(SpellInfo const* /*spellInfo*/) override
  1431. {
  1432. if (!sSpellMgr->GetSpellInfo(SPELL_GEN_THROW_INTERRUPT))
  1433. return false;
  1434. return true;
  1435. }
  1436. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  1437. {
  1438. PreventDefaultAction();
  1439. GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_GEN_THROW_INTERRUPT, true, NULL, aurEff);
  1440. }
  1441. void Register() override
  1442. {
  1443. OnEffectProc += AuraEffectProcFn(spell_gen_interrupt_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  1444. }
  1445. };
  1446. AuraScript* GetAuraScript() const override
  1447. {
  1448. return new spell_gen_interrupt_AuraScript();
  1449. }
  1450. };
  1451. class spell_gen_increase_stats_buff : public SpellScriptLoader
  1452. {
  1453. public:
  1454. spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { }
  1455. class spell_gen_increase_stats_buff_SpellScript : public SpellScript
  1456. {
  1457. PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript);
  1458. void HandleDummy(SpellEffIndex /*effIndex*/)
  1459. {
  1460. if (GetHitUnit()->IsInRaidWith(GetCaster()))
  1461. GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff
  1462. else
  1463. GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff
  1464. }
  1465. void Register() override
  1466. {
  1467. OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  1468. }
  1469. };
  1470. SpellScript* GetSpellScript() const override
  1471. {
  1472. return new spell_gen_increase_stats_buff_SpellScript();
  1473. }
  1474. };
  1475. enum GenericLifebloom
  1476. {
  1477. SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL = 43422,
  1478. SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL = 52552,
  1479. SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL = 53692,
  1480. SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL = 57763,
  1481. SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL = 66094
  1482. };
  1483. class spell_gen_lifebloom : public SpellScriptLoader
  1484. {
  1485. public:
  1486. spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { }
  1487. class spell_gen_lifebloom_AuraScript : public AuraScript
  1488. {
  1489. PrepareAuraScript(spell_gen_lifebloom_AuraScript);
  1490. public:
  1491. spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { }
  1492. bool Validate(SpellInfo const* /*spellInfo*/) override
  1493. {
  1494. if (!sSpellMgr->GetSpellInfo(_spellId))
  1495. return false;
  1496. return true;
  1497. }
  1498. void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
  1499. {
  1500. // Final heal only on duration end
  1501. if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
  1502. return;
  1503. // final heal
  1504. GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID());
  1505. }
  1506. void Register() override
  1507. {
  1508. AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
  1509. }
  1510. private:
  1511. uint32 _spellId;
  1512. };
  1513. AuraScript* GetAuraScript() const override
  1514. {
  1515. return new spell_gen_lifebloom_AuraScript(_spellId);
  1516. }
  1517. private:
  1518. uint32 _spellId;
  1519. };
  1520. /* DOCUMENTATION: Charge spells
  1521. Charge spells can be classified in four groups:
  1522. - Spells on vehicle bar used by players:
  1523. + EFFECT_0: SCRIPT_EFFECT
  1524. + EFFECT_1: TRIGGER_SPELL
  1525. + EFFECT_2: NONE
  1526. - Spells cast by player's mounts triggered by script:
  1527. + EFFECT_0: CHARGE
  1528. + EFFECT_1: TRIGGER_SPELL
  1529. + EFFECT_2: APPLY_AURA
  1530. - Spells cast by players on the target triggered by script:
  1531. + EFFECT_0: SCHOOL_DAMAGE
  1532. + EFFECT_1: SCRIPT_EFFECT
  1533. + EFFECT_2: NONE
  1534. - Spells cast by NPCs on players:
  1535. + EFFECT_0: SCHOOL_DAMAGE
  1536. + EFFECT_1: CHARGE
  1537. + EFFECT_2: SCRIPT_EFFECT
  1538. In the following script we handle the SCRIPT_EFFECT and CHARGE
  1539. - When handling SCRIPT_EFFECT:
  1540. + EFFECT_0: Corresponds to "Spells on vehicle bar used by players" and we make player's mount cast
  1541. the charge effect on the current target ("Spells cast by player's mounts triggered by script").
  1542. + EFFECT_1 and EFFECT_2: Triggered when "Spells cast by player's mounts triggered by script" hits target,
  1543. corresponding to "Spells cast by players on the target triggered by script" and "Spells cast by
  1544. NPCs on players" and we check Defend layers and drop a charge of the first found.
  1545. - When handling CHARGE:
  1546. + Only launched for "Spells cast by player's mounts triggered by script", makes the player cast the
  1547. damaging spell on target with a small chance of failing it.
  1548. */
  1549. enum ChargeSpells
  1550. {
  1551. SPELL_CHARGE_DAMAGE_8K5 = 62874,
  1552. SPELL_CHARGE_DAMAGE_20K = 68498,
  1553. SPELL_CHARGE_DAMAGE_45K = 64591,
  1554. SPELL_CHARGE_CHARGING_EFFECT_8K5 = 63661,
  1555. SPELL_CHARGE_CHARGING_EFFECT_20K_1 = 68284,
  1556. SPELL_CHARGE_CHARGING_EFFECT_20K_2 = 68501,
  1557. SPELL_CHARGE_CHARGING_EFFECT_45K_1 = 62563,
  1558. SPELL_CHARGE_CHARGING_EFFECT_45K_2 = 66481,
  1559. SPELL_CHARGE_TRIGGER_FACTION_MOUNTS = 62960,
  1560. SPELL_CHARGE_TRIGGER_TRIAL_CHAMPION = 68282,
  1561. SPELL_CHARGE_MISS_EFFECT = 62977,
  1562. };
  1563. class spell_gen_mounted_charge: public SpellScriptLoader
  1564. {
  1565. public:
  1566. spell_gen_mounted_charge() : SpellScriptLoader("spell_gen_mounted_charge") { }
  1567. class spell_gen_mounted_charge_SpellScript : public SpellScript
  1568. {
  1569. PrepareSpellScript(spell_gen_mounted_charge_SpellScript);
  1570. void HandleScriptEffect(SpellEffIndex effIndex)
  1571. {
  1572. Unit* target = GetHitUnit();
  1573. switch (effIndex)
  1574. {
  1575. case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual)
  1576. {
  1577. uint32 spellId;
  1578. switch (GetSpellInfo()->Id)
  1579. {
  1580. case SPELL_CHARGE_TRIGGER_TRIAL_CHAMPION:
  1581. spellId = SPELL_CHARGE_CHARGING_EFFECT_20K_1;
  1582. break;
  1583. case SPELL_CHARGE_TRIGGER_FACTION_MOUNTS:
  1584. spellId = SPELL_CHARGE_CHARGING_EFFECT_8K5;
  1585. break;
  1586. default:
  1587. return;
  1588. }
  1589. // If target isn't a training dummy there's a chance of failing the charge
  1590. if (!target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE) && roll_chance_f(12.5f))
  1591. spellId = SPELL_CHARGE_MISS_EFFECT;
  1592. if (Unit* vehicle = GetCaster()->GetVehicleBase())
  1593. vehicle->CastSpell(target, spellId, false);
  1594. else
  1595. GetCaster()->CastSpell(target, spellId, false);
  1596. break;
  1597. }
  1598. case EFFECT_1: // On damaging spells, for removing a defend layer
  1599. case EFFECT_2:
  1600. {
  1601. Unit::AuraApplicationMap const& auras = target->GetAppliedAuras();
  1602. for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
  1603. {
  1604. if (Aura* aura = itr->second->GetBase())
  1605. {
  1606. SpellInfo const* auraInfo = aura->GetSpellInfo();
  1607. if (auraInfo && auraInfo->SpellIconID == 2007 && aura->HasEffectType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN))
  1608. {
  1609. aura->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
  1610. // Remove dummys from rider (Necessary for updating visual shields)
  1611. if (Unit* rider = target->GetCharmer())
  1612. if (Aura* defend = rider->GetAura(aura->GetId()))
  1613. defend->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
  1614. break;
  1615. }
  1616. }
  1617. }
  1618. break;
  1619. }
  1620. }
  1621. }
  1622. void HandleChargeEffect(SpellEffIndex /*effIndex*/)
  1623. {
  1624. uint32 spellId;
  1625. switch (GetSpellInfo()->Id)
  1626. {
  1627. case SPELL_CHARGE_CHARGING_EFFECT_8K5:
  1628. spellId = SPELL_CHARGE_DAMAGE_8K5;
  1629. break;
  1630. case SPELL_CHARGE_CHARGING_EFFECT_20K_1:
  1631. case SPELL_CHARGE_CHARGING_EFFECT_20K_2:
  1632. spellId = SPELL_CHARGE_DAMAGE_20K;
  1633. break;
  1634. case SPELL_CHARGE_CHARGING_EFFECT_45K_1:
  1635. case SPELL_CHARGE_CHARGING_EFFECT_45K_2:
  1636. spellId = SPELL_CHARGE_DAMAGE_45K;
  1637. break;
  1638. default:
  1639. return;
  1640. }
  1641. if (Unit* rider = GetCaster()->GetCharmer())
  1642. rider->CastSpell(GetHitUnit(), spellId, false);
  1643. else
  1644. GetCaster()->CastSpell(GetHitUnit(), spellId, false);
  1645. }
  1646. void Register() override
  1647. {
  1648. SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(m_scriptSpellId);
  1649. if (spell->HasEffect(SPELL_EFFECT_SCRIPT_EFFECT))
  1650. OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT);
  1651. if (spell->Effects[EFFECT_0].Effect == SPELL_EFFECT_CHARGE)
  1652. OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleChargeEffect, EFFECT_0, SPELL_EFFECT_CHARGE);
  1653. }
  1654. };
  1655. SpellScript* GetSpellScript() const override
  1656. {
  1657. return new spell_gen_mounted_charge_SpellScript();
  1658. }
  1659. };
  1660. enum Netherbloom
  1661. {
  1662. SPELL_NETHERBLOOM_POLLEN_1 = 28703
  1663. };
  1664. // 28702 - Netherbloom
  1665. class spell_gen_netherbloom : public SpellScriptLoader
  1666. {
  1667. public:
  1668. spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { }
  1669. class spell_gen_netherbloom_SpellScript : public SpellScript
  1670. {
  1671. PrepareSpellScript(spell_gen_netherbloom_SpellScript);
  1672. bool Validate(SpellInfo const* /*spellInfo*/) override
  1673. {
  1674. for (uint8 i = 0; i < 5; ++i)
  1675. if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i))
  1676. return false;
  1677. return true;
  1678. }
  1679. void HandleScript(SpellEffIndex effIndex)
  1680. {
  1681. PreventHitDefaultEffect(effIndex);
  1682. if (Unit* target = GetHitUnit())
  1683. {
  1684. // 25% chance of casting a random buff
  1685. if (roll_chance_i(75))
  1686. return;
  1687. // triggered spells are 28703 to 28707
  1688. // Note: some sources say, that there was the possibility of
  1689. // receiving a debuff. However, this seems to be removed by a patch.
  1690. // don't overwrite an existing aura
  1691. for (uint8 i = 0; i < 5; ++i)
  1692. if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i))
  1693. return;
  1694. target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true);
  1695. }
  1696. }
  1697. void Register() override
  1698. {
  1699. OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  1700. }
  1701. };
  1702. SpellScript* GetSpellScript() const override
  1703. {
  1704. return new spell_gen_netherbloom_SpellScript();
  1705. }
  1706. };
  1707. enum NightmareVine
  1708. {
  1709. SPELL_NIGHTMARE_POLLEN = 28721
  1710. };
  1711. // 28720 - Nightmare Vine
  1712. class spell_gen_nightmare_vine : public SpellScriptLoader
  1713. {
  1714. public:
  1715. spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { }
  1716. class spell_gen_nightmare_vine_SpellScript : public SpellScript
  1717. {
  1718. PrepareSpellScript(spell_gen_nightmare_vine_SpellScript);
  1719. bool Validate(SpellInfo const* /*spellInfo*/) override
  1720. {
  1721. if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN))
  1722. return false;
  1723. return true;
  1724. }
  1725. void HandleScript(SpellEffIndex effIndex)
  1726. {
  1727. PreventHitDefaultEffect(effIndex);
  1728. if (Unit* target = GetHitUnit())
  1729. {
  1730. // 25% chance of casting Nightmare Pollen
  1731. if (roll_chance_i(25))
  1732. target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true);
  1733. }
  1734. }
  1735. void Register() override
  1736. {
  1737. OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  1738. }
  1739. };
  1740. SpellScript* GetSpellScript() const override
  1741. {
  1742. return new spell_gen_nightmare_vine_SpellScript();
  1743. }
  1744. };
  1745. enum ObsidianArmor
  1746. {
  1747. SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536,
  1748. SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533,
  1749. SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538,
  1750. SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534,
  1751. SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535,
  1752. SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540
  1753. };
  1754. // 27539 - Obsidian Armor
  1755. class spell_gen_obsidian_armor : public SpellScriptLoader
  1756. {
  1757. public:
  1758. spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { }
  1759. class spell_gen_obsidian_armor_AuraScript : public AuraScript
  1760. {
  1761. PrepareAuraScript(spell_gen_obsidian_armor_AuraScript);
  1762. bool Validate(SpellInfo const* /*spellInfo*/) override
  1763. {
  1764. if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) ||
  1765. !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) ||
  1766. !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) ||
  1767. !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) ||
  1768. !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) ||
  1769. !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE))
  1770. return false;
  1771. return true;
  1772. }
  1773. bool CheckProc(ProcEventInfo& eventInfo)
  1774. {
  1775. if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
  1776. return false;
  1777. if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL)
  1778. return false;
  1779. return true;
  1780. }
  1781. void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  1782. {
  1783. PreventDefaultAction();
  1784. uint32 spellId = 0;
  1785. switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
  1786. {
  1787. case SPELL_SCHOOL_HOLY:
  1788. spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY;
  1789. break;
  1790. case SPELL_SCHOOL_FIRE:
  1791. spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE;
  1792. break;
  1793. case SPELL_SCHOOL_NATURE:
  1794. spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE;
  1795. break;
  1796. case SPELL_SCHOOL_FROST:
  1797. spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST;
  1798. break;
  1799. case SPELL_SCHOOL_SHADOW:
  1800. spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW;
  1801. break;
  1802. case SPELL_SCHOOL_ARCANE:
  1803. spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE;
  1804. break;
  1805. default:
  1806. return;
  1807. }
  1808. GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
  1809. }
  1810. void Register() override
  1811. {
  1812. DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc);
  1813. OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
  1814. }
  1815. };
  1816. AuraScript* GetAuraScript() const override
  1817. {
  1818. return new spell_gen_obsidian_armor_AuraScript();
  1819. }
  1820. };
  1821. enum TournamentPennantSpells
  1822. {
  1823. SPELL_PENNANT_STORMWIND_ASPIRANT = 62595,
  1824. SPELL_PENNANT_STORMWIND_VALIANT = 62596,
  1825. SPELL_PENNANT_STORMWIND_CHAMPION = 62594,
  1826. SPELL_PENNANT_GNOMEREGAN_ASPIRANT = 63394,
  1827. SPELL_PENNANT_GNOMEREGAN_VALIANT = 63395,
  1828. SPELL_PENNANT_GNOMEREGAN_CHAMPION = 63396,
  1829. SPELL_PENNANT_SEN_JIN_ASPIRANT = 63397,
  1830. SPELL_PENNANT_SEN_JIN_VALIANT = 63398,
  1831. SPELL_PENNANT_SEN_JIN_CHAMPION = 63399,
  1832. SPELL_PENNANT_SILVERMOON_ASPIRANT = 63401,
  1833. SPELL_PENNANT_SILVERMOON_VALIANT = 63402,
  1834. SPELL_PENNANT_SILVERMOON_CHAMPION = 63403,
  1835. SPELL_PENNANT_DARNASSUS_ASPIRANT = 63404,
  1836. SPELL_PENNANT_DARNASSUS_VALIANT = 63405,
  1837. SPELL_PENNANT_DARNASSUS_CHAMPION = 63406,
  1838. SPELL_PENNANT_EXODAR_ASPIRANT = 63421,
  1839. SPELL_PENNANT_EXODAR_VALIANT = 63422,
  1840. SPELL_PENNANT_EXODAR_CHAMPION = 63423,
  1841. SPELL_PENNANT_IRONFORGE_ASPIRANT = 63425,
  1842. SPELL_PENNANT_IRONFORGE_VALIANT = 63426,
  1843. SPELL_PENNANT_IRONFORGE_CHAMPION = 63427,
  1844. SPELL_PENNANT_UNDERCITY_ASPIRANT = 63428,
  1845. SPELL_PENNANT_UNDERCITY_VALIANT = 63429,
  1846. SPELL_PENNANT_UNDERCITY_CHAMPION = 63430,
  1847. SPELL_PENNANT_ORGRIMMAR_ASPIRANT = 63431,
  1848. SPELL_PENNANT_ORGRIMMAR_VALIANT = 63432,
  1849. SPELL_PENNANT_ORGRIMMAR_CHAMPION = 63433,
  1850. SPELL_PENNANT_THUNDER_BLUFF_ASPIRANT = 63434,
  1851. SPELL_PENNANT_THUNDER_BLUFF_VALIANT = 63435,
  1852. SPELL_PENNANT_THUNDER_BLUFF_CHAMPION = 63436,
  1853. SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT = 63606,
  1854. SPELL_PENNANT_ARGENT_CRUSADE_VALIANT = 63500,
  1855. SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION = 63501,
  1856. SPELL_PENNANT_EBON_BLADE_ASPIRANT = 63607,
  1857. SPELL_PENNANT_EBON_BLADE_VALIANT = 63608,
  1858. SPELL_PENNANT_EBON_BLADE_CHAMPION = 63609
  1859. };
  1860. enum TournamentMounts
  1861. {
  1862. NPC_STORMWIND_STEED = 33217,
  1863. NPC_IRONFORGE_RAM = 33316,
  1864. NPC_GNOMEREGAN_MECHANOSTRIDER = 33317,
  1865. NPC_EXODAR_ELEKK = 33318,
  1866. NPC_DARNASSIAN_NIGHTSABER = 33319,
  1867. NPC_ORGRIMMAR_WOLF = 33320,
  1868. NPC_DARK_SPEAR_RAPTOR = 33321,
  1869. NPC_THUNDER_BLUFF_KODO = 33322,
  1870. NPC_SILVERMOON_HAWKSTRIDER = 33323,
  1871. NPC_FORSAKEN_WARHORSE = 33324,
  1872. NPC_ARGENT_WARHORSE = 33782,
  1873. NPC_ARGENT_STEED_ASPIRANT = 33845,
  1874. NPC_ARGENT_HAWKSTRIDER_ASPIRANT = 33844
  1875. };
  1876. enum TournamentQuestsAchievements
  1877. {
  1878. ACHIEVEMENT_CHAMPION_STORMWIND = 2781,
  1879. ACHIEVEMENT_CHAMPION_DARNASSUS = 2777,
  1880. ACHIEVEMENT_CHAMPION_IRONFORGE = 2780,
  1881. ACHIEVEMENT_CHAMPION_GNOMEREGAN = 2779,
  1882. ACHIEVEMENT_CHAMPION_THE_EXODAR = 2778,
  1883. ACHIEVEMENT_CHAMPION_ORGRIMMAR = 2783,
  1884. ACHIEVEMENT_CHAMPION_SEN_JIN = 2784,
  1885. ACHIEVEMENT_CHAMPION_THUNDER_BLUFF = 2786,
  1886. ACHIEVEMENT_CHAMPION_UNDERCITY = 2787,
  1887. ACHIEVEMENT_CHAMPION_SILVERMOON = 2785,
  1888. ACHIEVEMENT_ARGENT_VALOR = 2758,
  1889. ACHIEVEMENT_CHAMPION_ALLIANCE = 2782,
  1890. ACHIEVEMENT_CHAMPION_HORDE = 2788,
  1891. QUEST_VALIANT_OF_STORMWIND = 13593,
  1892. QUEST_A_VALIANT_OF_STORMWIND = 13684,
  1893. QUEST_VALIANT_OF_DARNASSUS = 13706,
  1894. QUEST_A_VALIANT_OF_DARNASSUS = 13689,
  1895. QUEST_VALIANT_OF_IRONFORGE = 13703,
  1896. QUEST_A_VALIANT_OF_IRONFORGE = 13685,
  1897. QUEST_VALIANT_OF_GNOMEREGAN = 13704,
  1898. QUEST_A_VALIANT_OF_GNOMEREGAN = 13688,
  1899. QUEST_VALIANT_OF_THE_EXODAR = 13705,
  1900. QUEST_A_VALIANT_OF_THE_EXODAR = 13690,
  1901. QUEST_VALIANT_OF_ORGRIMMAR = 13707,
  1902. QUEST_A_VALIANT_OF_ORGRIMMAR = 13691,
  1903. QUEST_VALIANT_OF_SEN_JIN = 13708,
  1904. QUEST_A_VALIANT_OF_SEN_JIN = 13693,
  1905. QUEST_VALIANT_OF_THUNDER_BLUFF = 13709,
  1906. QUEST_A_VALIANT_OF_THUNDER_BLUFF = 13694,
  1907. QUEST_VALIANT_OF_UNDERCITY = 13710,
  1908. QUEST_A_VALIANT_OF_UNDERCITY = 13695,
  1909. QUEST_VALIANT_OF_SILVERMOON = 13711,
  1910. QUEST_A_VALIANT_OF_SILVERMOON = 13696
  1911. };
  1912. class spell_gen_on_tournament_mount : public SpellScriptLoader
  1913. {
  1914. public:
  1915. spell_gen_on_tournament_mount() : SpellScriptLoader("spell_gen_on_tournament_mount") { }
  1916. class spell_gen_on_tournament_mount_AuraScript : public AuraScript
  1917. {
  1918. PrepareAuraScript(spell_gen_on_tournament_mount_AuraScript);
  1919. public:
  1920. spell_gen_on_tournament_mount_AuraScript()
  1921. {
  1922. _pennantSpellId = 0;
  1923. }
  1924. private:
  1925. uint32 _pennantSpellId;
  1926. bool Load() override
  1927. {
  1928. return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
  1929. }
  1930. void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  1931. {
  1932. if (Unit* caster = GetCaster())
  1933. {
  1934. if (Unit* vehicle = caster->GetVehicleBase())
  1935. {
  1936. _pennantSpellId = GetPennatSpellId(caster->ToPlayer(), vehicle);
  1937. caster->CastSpell(caster, _pennantSpellId, true);
  1938. }
  1939. }
  1940. }
  1941. void HandleRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  1942. {
  1943. if (Unit* caster = GetCaster())
  1944. caster->RemoveAurasDueToSpell(_pennantSpellId);
  1945. }
  1946. uint32 GetPennatSpellId(Player* player, Unit* mount)
  1947. {
  1948. switch (mount->GetEntry())
  1949. {
  1950. case NPC_ARGENT_STEED_ASPIRANT:
  1951. case NPC_STORMWIND_STEED:
  1952. {
  1953. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_STORMWIND))
  1954. return SPELL_PENNANT_STORMWIND_CHAMPION;
  1955. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_STORMWIND) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_STORMWIND))
  1956. return SPELL_PENNANT_STORMWIND_VALIANT;
  1957. else
  1958. return SPELL_PENNANT_STORMWIND_ASPIRANT;
  1959. }
  1960. case NPC_GNOMEREGAN_MECHANOSTRIDER:
  1961. {
  1962. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_GNOMEREGAN))
  1963. return SPELL_PENNANT_GNOMEREGAN_CHAMPION;
  1964. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_GNOMEREGAN) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_GNOMEREGAN))
  1965. return SPELL_PENNANT_GNOMEREGAN_VALIANT;
  1966. else
  1967. return SPELL_PENNANT_GNOMEREGAN_ASPIRANT;
  1968. }
  1969. case NPC_DARK_SPEAR_RAPTOR:
  1970. {
  1971. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_SEN_JIN))
  1972. return SPELL_PENNANT_SEN_JIN_CHAMPION;
  1973. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_SEN_JIN) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_SEN_JIN))
  1974. return SPELL_PENNANT_SEN_JIN_VALIANT;
  1975. else
  1976. return SPELL_PENNANT_SEN_JIN_ASPIRANT;
  1977. }
  1978. case NPC_ARGENT_HAWKSTRIDER_ASPIRANT:
  1979. case NPC_SILVERMOON_HAWKSTRIDER:
  1980. {
  1981. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_SILVERMOON))
  1982. return SPELL_PENNANT_SILVERMOON_CHAMPION;
  1983. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_SILVERMOON) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_SILVERMOON))
  1984. return SPELL_PENNANT_SILVERMOON_VALIANT;
  1985. else
  1986. return SPELL_PENNANT_SILVERMOON_ASPIRANT;
  1987. }
  1988. case NPC_DARNASSIAN_NIGHTSABER:
  1989. {
  1990. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_DARNASSUS))
  1991. return SPELL_PENNANT_DARNASSUS_CHAMPION;
  1992. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_DARNASSUS) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_DARNASSUS))
  1993. return SPELL_PENNANT_DARNASSUS_VALIANT;
  1994. else
  1995. return SPELL_PENNANT_DARNASSUS_ASPIRANT;
  1996. }
  1997. case NPC_EXODAR_ELEKK:
  1998. {
  1999. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_THE_EXODAR))
  2000. return SPELL_PENNANT_EXODAR_CHAMPION;
  2001. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_THE_EXODAR) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_THE_EXODAR))
  2002. return SPELL_PENNANT_EXODAR_VALIANT;
  2003. else
  2004. return SPELL_PENNANT_EXODAR_ASPIRANT;
  2005. }
  2006. case NPC_IRONFORGE_RAM:
  2007. {
  2008. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_IRONFORGE))
  2009. return SPELL_PENNANT_IRONFORGE_CHAMPION;
  2010. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_IRONFORGE) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_IRONFORGE))
  2011. return SPELL_PENNANT_IRONFORGE_VALIANT;
  2012. else
  2013. return SPELL_PENNANT_IRONFORGE_ASPIRANT;
  2014. }
  2015. case NPC_FORSAKEN_WARHORSE:
  2016. {
  2017. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_UNDERCITY))
  2018. return SPELL_PENNANT_UNDERCITY_CHAMPION;
  2019. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_UNDERCITY) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_UNDERCITY))
  2020. return SPELL_PENNANT_UNDERCITY_VALIANT;
  2021. else
  2022. return SPELL_PENNANT_UNDERCITY_ASPIRANT;
  2023. }
  2024. case NPC_ORGRIMMAR_WOLF:
  2025. {
  2026. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_ORGRIMMAR))
  2027. return SPELL_PENNANT_ORGRIMMAR_CHAMPION;
  2028. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_ORGRIMMAR) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_ORGRIMMAR))
  2029. return SPELL_PENNANT_ORGRIMMAR_VALIANT;
  2030. else
  2031. return SPELL_PENNANT_ORGRIMMAR_ASPIRANT;
  2032. }
  2033. case NPC_THUNDER_BLUFF_KODO:
  2034. {
  2035. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_THUNDER_BLUFF))
  2036. return SPELL_PENNANT_THUNDER_BLUFF_CHAMPION;
  2037. else if (player->GetQuestRewardStatus(QUEST_VALIANT_OF_THUNDER_BLUFF) || player->GetQuestRewardStatus(QUEST_A_VALIANT_OF_THUNDER_BLUFF))
  2038. return SPELL_PENNANT_THUNDER_BLUFF_VALIANT;
  2039. else
  2040. return SPELL_PENNANT_THUNDER_BLUFF_ASPIRANT;
  2041. }
  2042. case NPC_ARGENT_WARHORSE:
  2043. {
  2044. if (player->HasAchieved(ACHIEVEMENT_CHAMPION_ALLIANCE) || player->HasAchieved(ACHIEVEMENT_CHAMPION_HORDE))
  2045. return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_CHAMPION : SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION;
  2046. else if (player->HasAchieved(ACHIEVEMENT_ARGENT_VALOR))
  2047. return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_VALIANT : SPELL_PENNANT_ARGENT_CRUSADE_VALIANT;
  2048. else
  2049. return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_ASPIRANT : SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT;
  2050. }
  2051. default:
  2052. return 0;
  2053. }
  2054. }
  2055. void Register() override
  2056. {
  2057. AfterEffectApply += AuraEffectApplyFn(spell_gen_on_tournament_mount_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  2058. OnEffectRemove += AuraEffectRemoveFn(spell_gen_on_tournament_mount_AuraScript::HandleRemoveEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  2059. }
  2060. };
  2061. AuraScript* GetAuraScript() const override
  2062. {
  2063. return new spell_gen_on_tournament_mount_AuraScript();
  2064. }
  2065. };
  2066. class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader
  2067. {
  2068. public:
  2069. spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { }
  2070. class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript
  2071. {
  2072. PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript);
  2073. bool Load() override
  2074. {
  2075. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2076. }
  2077. void HandleDummy(SpellEffIndex effIndex)
  2078. {
  2079. Player* player = GetCaster()->ToPlayer();
  2080. uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue();
  2081. int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
  2082. FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
  2083. if (!factionEntry)
  2084. return;
  2085. // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated)
  2086. // Not when player already has equal or higher rep with this faction
  2087. if (player->GetReputationMgr().GetReputation(factionEntry) < repChange)
  2088. player->GetReputationMgr().SetReputation(factionEntry, repChange);
  2089. // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation
  2090. }
  2091. void Register() override
  2092. {
  2093. OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  2094. }
  2095. };
  2096. SpellScript* GetSpellScript() const override
  2097. {
  2098. return new spell_gen_oracle_wolvar_reputation_SpellScript();
  2099. }
  2100. };
  2101. enum OrcDisguiseSpells
  2102. {
  2103. SPELL_ORC_DISGUISE_TRIGGER = 45759,
  2104. SPELL_ORC_DISGUISE_MALE = 45760,
  2105. SPELL_ORC_DISGUISE_FEMALE = 45762
  2106. };
  2107. class spell_gen_orc_disguise : public SpellScriptLoader
  2108. {
  2109. public:
  2110. spell_gen_orc_disguise() : SpellScriptLoader("spell_gen_orc_disguise") { }
  2111. class spell_gen_orc_disguise_SpellScript : public SpellScript
  2112. {
  2113. PrepareSpellScript(spell_gen_orc_disguise_SpellScript);
  2114. bool Validate(SpellInfo const* /*spellInfo*/) override
  2115. {
  2116. if (!sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_TRIGGER) ||
  2117. !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_MALE) ||
  2118. !sSpellMgr->GetSpellInfo(SPELL_ORC_DISGUISE_FEMALE))
  2119. return false;
  2120. return true;
  2121. }
  2122. void HandleScript(SpellEffIndex /*effIndex*/)
  2123. {
  2124. Unit* caster = GetCaster();
  2125. if (Player* target = GetHitPlayer())
  2126. {
  2127. uint8 gender = target->getGender();
  2128. if (!gender)
  2129. caster->CastSpell(target, SPELL_ORC_DISGUISE_MALE, true);
  2130. else
  2131. caster->CastSpell(target, SPELL_ORC_DISGUISE_FEMALE, true);
  2132. }
  2133. }
  2134. void Register() override
  2135. {
  2136. OnEffectHitTarget += SpellEffectFn(spell_gen_orc_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  2137. }
  2138. };
  2139. SpellScript* GetSpellScript() const override
  2140. {
  2141. return new spell_gen_orc_disguise_SpellScript();
  2142. }
  2143. };
  2144. enum ParachuteSpells
  2145. {
  2146. SPELL_PARACHUTE = 45472,
  2147. SPELL_PARACHUTE_BUFF = 44795,
  2148. };
  2149. // 45472 Parachute
  2150. class spell_gen_parachute : public SpellScriptLoader
  2151. {
  2152. public:
  2153. spell_gen_parachute() : SpellScriptLoader("spell_gen_parachute") { }
  2154. class spell_gen_parachute_AuraScript : public AuraScript
  2155. {
  2156. PrepareAuraScript(spell_gen_parachute_AuraScript);
  2157. bool Validate(SpellInfo const* /*spellInfo*/) override
  2158. {
  2159. if (!sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) ||
  2160. !sSpellMgr->GetSpellInfo(SPELL_PARACHUTE_BUFF))
  2161. return false;
  2162. return true;
  2163. }
  2164. void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
  2165. {
  2166. if (Player* target = GetTarget()->ToPlayer())
  2167. if (target->IsFalling())
  2168. {
  2169. target->RemoveAurasDueToSpell(SPELL_PARACHUTE);
  2170. target->CastSpell(target, SPELL_PARACHUTE_BUFF, true);
  2171. }
  2172. }
  2173. void Register() override
  2174. {
  2175. OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
  2176. }
  2177. };
  2178. AuraScript* GetAuraScript() const override
  2179. {
  2180. return new spell_gen_parachute_AuraScript();
  2181. }
  2182. };
  2183. enum PetSummoned
  2184. {
  2185. NPC_DOOMGUARD = 11859,
  2186. NPC_INFERNAL = 89,
  2187. NPC_IMP = 416
  2188. };
  2189. class spell_gen_pet_summoned : public SpellScriptLoader
  2190. {
  2191. public:
  2192. spell_gen_pet_summoned() : SpellScriptLoader("spell_gen_pet_summoned") { }
  2193. class spell_gen_pet_summoned_SpellScript : public SpellScript
  2194. {
  2195. PrepareSpellScript(spell_gen_pet_summoned_SpellScript);
  2196. bool Load() override
  2197. {
  2198. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2199. }
  2200. void HandleScript(SpellEffIndex /*effIndex*/)
  2201. {
  2202. Player* player = GetCaster()->ToPlayer();
  2203. if (player->GetLastPetNumber())
  2204. {
  2205. PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET;
  2206. Pet* newPet = new Pet(player, newPetType);
  2207. if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true))
  2208. {
  2209. // revive the pet if it is dead
  2210. if (newPet->getDeathState() == DEAD)
  2211. newPet->setDeathState(ALIVE);
  2212. newPet->SetFullHealth();
  2213. newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType()));
  2214. switch (newPet->GetEntry())
  2215. {
  2216. case NPC_DOOMGUARD:
  2217. case NPC_INFERNAL:
  2218. newPet->SetEntry(NPC_IMP);
  2219. break;
  2220. default:
  2221. break;
  2222. }
  2223. }
  2224. else
  2225. delete newPet;
  2226. }
  2227. }
  2228. void Register() override
  2229. {
  2230. OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  2231. }
  2232. };
  2233. SpellScript* GetSpellScript() const override
  2234. {
  2235. return new spell_gen_pet_summoned_SpellScript();
  2236. }
  2237. };
  2238. class spell_gen_profession_research : public SpellScriptLoader
  2239. {
  2240. public:
  2241. spell_gen_profession_research() : SpellScriptLoader("spell_gen_profession_research") { }
  2242. class spell_gen_profession_research_SpellScript : public SpellScript
  2243. {
  2244. PrepareSpellScript(spell_gen_profession_research_SpellScript);
  2245. bool Load() override
  2246. {
  2247. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2248. }
  2249. SpellCastResult CheckRequirement()
  2250. {
  2251. if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer()))
  2252. {
  2253. SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER);
  2254. return SPELL_FAILED_CUSTOM_ERROR;
  2255. }
  2256. return SPELL_CAST_OK;
  2257. }
  2258. void HandleScript(SpellEffIndex /*effIndex*/)
  2259. {
  2260. Player* caster = GetCaster()->ToPlayer();
  2261. uint32 spellId = GetSpellInfo()->Id;
  2262. // learn random explicit discovery recipe (if any)
  2263. if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster))
  2264. caster->LearnSpell(discoveredSpellId, false);
  2265. caster->UpdateCraftSkill(spellId);
  2266. }
  2267. void Register() override
  2268. {
  2269. OnCheckCast += SpellCheckCastFn(spell_gen_profession_research_SpellScript::CheckRequirement);
  2270. OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
  2271. }
  2272. };
  2273. SpellScript* GetSpellScript() const override
  2274. {
  2275. return new spell_gen_profession_research_SpellScript();
  2276. }
  2277. };
  2278. class spell_gen_remove_flight_auras : public SpellScriptLoader
  2279. {
  2280. public:
  2281. spell_gen_remove_flight_auras() : SpellScriptLoader("spell_gen_remove_flight_auras") { }
  2282. class spell_gen_remove_flight_auras_SpellScript : public SpellScript
  2283. {
  2284. PrepareSpellScript(spell_gen_remove_flight_auras_SpellScript);
  2285. void HandleScript(SpellEffIndex /*effIndex*/)
  2286. {
  2287. if (Unit* target = GetHitUnit())
  2288. {
  2289. target->RemoveAurasByType(SPELL_AURA_FLY);
  2290. target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED);
  2291. }
  2292. }
  2293. void Register() override
  2294. {
  2295. OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
  2296. }
  2297. };
  2298. SpellScript* GetSpellScript() const override
  2299. {
  2300. return new spell_gen_remove_flight_auras_SpellScript();
  2301. }
  2302. };
  2303. enum Replenishment
  2304. {
  2305. SPELL_REPLENISHMENT = 57669,
  2306. SPELL_INFINITE_REPLENISHMENT = 61782
  2307. };
  2308. class ReplenishmentCheck
  2309. {
  2310. public:
  2311. bool operator()(WorldObject* obj) const
  2312. {
  2313. if (Unit* target = obj->ToUnit())
  2314. return target->getPowerType() != POWER_MANA;
  2315. return true;
  2316. }
  2317. };
  2318. class spell_gen_replenishment : public SpellScriptLoader
  2319. {
  2320. public:
  2321. spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { }
  2322. class spell_gen_replenishment_SpellScript : public SpellScript
  2323. {
  2324. PrepareSpellScript(spell_gen_replenishment_SpellScript);
  2325. void RemoveInvalidTargets(std::list<WorldObject*>& targets)
  2326. {
  2327. // In arenas Replenishment may only affect the caster
  2328. if (Player* caster = GetCaster()->ToPlayer())
  2329. {
  2330. if (caster->InArena())
  2331. {
  2332. targets.clear();
  2333. targets.push_back(caster);
  2334. return;
  2335. }
  2336. }
  2337. targets.remove_if(ReplenishmentCheck());
  2338. uint8 const maxTargets = 10;
  2339. if (targets.size() > maxTargets)
  2340. {
  2341. targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
  2342. targets.resize(maxTargets);
  2343. }
  2344. }
  2345. void Register() override
  2346. {
  2347. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_replenishment_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID);
  2348. }
  2349. };
  2350. SpellScript* GetSpellScript() const override
  2351. {
  2352. return new spell_gen_replenishment_SpellScript();
  2353. }
  2354. class spell_gen_replenishment_AuraScript : public AuraScript
  2355. {
  2356. PrepareAuraScript(spell_gen_replenishment_AuraScript);
  2357. bool Load() override
  2358. {
  2359. return GetUnitOwner()->getPowerType() == POWER_MANA;
  2360. }
  2361. void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
  2362. {
  2363. switch (GetSpellInfo()->Id)
  2364. {
  2365. case SPELL_REPLENISHMENT:
  2366. amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f;
  2367. break;
  2368. case SPELL_INFINITE_REPLENISHMENT:
  2369. amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f;
  2370. break;
  2371. default:
  2372. break;
  2373. }
  2374. }
  2375. void Register() override
  2376. {
  2377. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE);
  2378. }
  2379. };
  2380. AuraScript* GetAuraScript() const override
  2381. {
  2382. return new spell_gen_replenishment_AuraScript();
  2383. }
  2384. };
  2385. enum RunningWildMountIds
  2386. {
  2387. RUNNING_WILD_MODEL_MALE = 29422,
  2388. RUNNING_WILD_MODEL_FEMALE = 29423,
  2389. SPELL_ALTERED_FORM = 97709
  2390. };
  2391. class spell_gen_running_wild : public SpellScriptLoader
  2392. {
  2393. public:
  2394. spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { }
  2395. class spell_gen_running_wild_AuraScript : public AuraScript
  2396. {
  2397. PrepareAuraScript(spell_gen_running_wild_AuraScript);
  2398. bool Validate(SpellInfo const* /*spell*/) override
  2399. {
  2400. if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE))
  2401. return false;
  2402. if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE))
  2403. return false;
  2404. return true;
  2405. }
  2406. void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
  2407. {
  2408. Unit* target = GetTarget();
  2409. PreventDefaultAction();
  2410. target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0);
  2411. // cast speed aura
  2412. if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount()))
  2413. target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK);
  2414. }
  2415. void Register() override
  2416. {
  2417. OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL);
  2418. }
  2419. };
  2420. class spell_gen_running_wild_SpellScript : public SpellScript
  2421. {
  2422. PrepareSpellScript(spell_gen_running_wild_SpellScript);
  2423. bool Validate(SpellInfo const* /*spell*/) override
  2424. {
  2425. if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM))
  2426. return false;
  2427. return true;
  2428. }
  2429. bool Load() override
  2430. {
  2431. // Definitely not a good thing, but currently the only way to do something at cast start
  2432. // Should be replaced as soon as possible with a new hook: BeforeCastStart
  2433. GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
  2434. return false;
  2435. }
  2436. void Register() override
  2437. {
  2438. }
  2439. };
  2440. AuraScript* GetAuraScript() const override
  2441. {
  2442. return new spell_gen_running_wild_AuraScript();
  2443. }
  2444. SpellScript* GetSpellScript() const override
  2445. {
  2446. return new spell_gen_running_wild_SpellScript();
  2447. }
  2448. };
  2449. class spell_gen_two_forms : public SpellScriptLoader
  2450. {
  2451. public:
  2452. spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { }
  2453. class spell_gen_two_forms_SpellScript : public SpellScript
  2454. {
  2455. PrepareSpellScript(spell_gen_two_forms_SpellScript);
  2456. SpellCastResult CheckCast()
  2457. {
  2458. if (GetCaster()->IsInCombat())
  2459. {
  2460. SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
  2461. return SPELL_FAILED_CUSTOM_ERROR;
  2462. }
  2463. // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight)
  2464. if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1)
  2465. {
  2466. SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
  2467. return SPELL_FAILED_CUSTOM_ERROR;
  2468. }
  2469. return SPELL_CAST_OK;
  2470. }
  2471. void HandleTransform(SpellEffIndex effIndex)
  2472. {
  2473. Unit* target = GetHitUnit();
  2474. PreventHitDefaultEffect(effIndex);
  2475. if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM))
  2476. target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM);
  2477. else // Basepoints 1 for this aura control whether to trigger transform transition animation or not.
  2478. target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK);
  2479. }
  2480. void Register() override
  2481. {
  2482. OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast);
  2483. OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY);
  2484. }
  2485. };
  2486. SpellScript* GetSpellScript() const override
  2487. {
  2488. return new spell_gen_two_forms_SpellScript();
  2489. }
  2490. };
  2491. class spell_gen_darkflight : public SpellScriptLoader
  2492. {
  2493. public:
  2494. spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { }
  2495. class spell_gen_darkflight_SpellScript : public SpellScript
  2496. {
  2497. PrepareSpellScript(spell_gen_darkflight_SpellScript);
  2498. void TriggerTransform()
  2499. {
  2500. GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
  2501. }
  2502. void Register() override
  2503. {
  2504. AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform);
  2505. }
  2506. };
  2507. SpellScript* GetSpellScript() const override
  2508. {
  2509. return new spell_gen_darkflight_SpellScript();
  2510. }
  2511. };
  2512. enum SeaforiumSpells
  2513. {
  2514. SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT = 60937
  2515. };
  2516. class spell_gen_seaforium_blast : public SpellScriptLoader
  2517. {
  2518. public:
  2519. spell_gen_seaforium_blast() : SpellScriptLoader("spell_gen_seaforium_blast") { }
  2520. class spell_gen_seaforium_blast_SpellScript : public SpellScript
  2521. {
  2522. PrepareSpellScript(spell_gen_seaforium_blast_SpellScript);
  2523. bool Validate(SpellInfo const* /*spellInfo*/) override
  2524. {
  2525. if (!sSpellMgr->GetSpellInfo(SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT))
  2526. return false;
  2527. return true;
  2528. }
  2529. bool Load() override
  2530. {
  2531. // OriginalCaster is always available in Spell::prepare
  2532. return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER;
  2533. }
  2534. void AchievementCredit(SpellEffIndex /*effIndex*/)
  2535. {
  2536. // but in effect handling OriginalCaster can become NULL
  2537. if (Unit* originalCaster = GetOriginalCaster())
  2538. if (GameObject* go = GetHitGObj())
  2539. if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
  2540. originalCaster->CastSpell(originalCaster, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true);
  2541. }
  2542. void Register() override
  2543. {
  2544. OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE);
  2545. }
  2546. };
  2547. SpellScript* GetSpellScript() const override
  2548. {
  2549. return new spell_gen_seaforium_blast_SpellScript();
  2550. }
  2551. };
  2552. enum SpectatorCheerTrigger
  2553. {
  2554. EMOTE_ONE_SHOT_CHEER = 4,
  2555. EMOTE_ONE_SHOT_EXCLAMATION = 5,
  2556. EMOTE_ONE_SHOT_APPLAUD = 21
  2557. };
  2558. uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, EMOTE_ONE_SHOT_APPLAUD };
  2559. class spell_gen_spectator_cheer_trigger : public SpellScriptLoader
  2560. {
  2561. public:
  2562. spell_gen_spectator_cheer_trigger() : SpellScriptLoader("spell_gen_spectator_cheer_trigger") { }
  2563. class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript
  2564. {
  2565. PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript);
  2566. void HandleDummy(SpellEffIndex /*effIndex*/)
  2567. {
  2568. GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]);
  2569. }
  2570. void Register() override
  2571. {
  2572. OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  2573. }
  2574. };
  2575. SpellScript* GetSpellScript() const override
  2576. {
  2577. return new spell_gen_spectator_cheer_trigger_SpellScript();
  2578. }
  2579. };
  2580. class spell_gen_spirit_healer_res : public SpellScriptLoader
  2581. {
  2582. public:
  2583. spell_gen_spirit_healer_res(): SpellScriptLoader("spell_gen_spirit_healer_res") { }
  2584. class spell_gen_spirit_healer_res_SpellScript : public SpellScript
  2585. {
  2586. PrepareSpellScript(spell_gen_spirit_healer_res_SpellScript);
  2587. bool Load() override
  2588. {
  2589. return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER;
  2590. }
  2591. void HandleDummy(SpellEffIndex /* effIndex */)
  2592. {
  2593. Player* originalCaster = GetOriginalCaster()->ToPlayer();
  2594. if (Unit* target = GetHitUnit())
  2595. {
  2596. WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8);
  2597. data << uint64(target->GetGUID());
  2598. originalCaster->GetSession()->SendPacket(&data);
  2599. }
  2600. }
  2601. void Register() override
  2602. {
  2603. OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  2604. }
  2605. };
  2606. SpellScript* GetSpellScript() const override
  2607. {
  2608. return new spell_gen_spirit_healer_res_SpellScript();
  2609. }
  2610. };
  2611. enum SummonElemental
  2612. {
  2613. SPELL_SUMMON_FIRE_ELEMENTAL = 8985,
  2614. SPELL_SUMMON_EARTH_ELEMENTAL = 19704
  2615. };
  2616. class spell_gen_summon_elemental : public SpellScriptLoader
  2617. {
  2618. public:
  2619. spell_gen_summon_elemental(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { }
  2620. class spell_gen_summon_elemental_AuraScript : public AuraScript
  2621. {
  2622. PrepareAuraScript(spell_gen_summon_elemental_AuraScript);
  2623. public:
  2624. spell_gen_summon_elemental_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { }
  2625. bool Validate(SpellInfo const* /*spellInfo*/) override
  2626. {
  2627. if (!sSpellMgr->GetSpellInfo(_spellId))
  2628. return false;
  2629. return true;
  2630. }
  2631. void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  2632. {
  2633. if (GetCaster())
  2634. if (Unit* owner = GetCaster()->GetOwner())
  2635. owner->CastSpell(owner, _spellId, true);
  2636. }
  2637. void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  2638. {
  2639. if (GetCaster())
  2640. if (Unit* owner = GetCaster()->GetOwner())
  2641. if (owner->GetTypeId() == TYPEID_PLAYER) /// @todo this check is maybe wrong
  2642. owner->ToPlayer()->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
  2643. }
  2644. void Register() override
  2645. {
  2646. AfterEffectApply += AuraEffectApplyFn(spell_gen_summon_elemental_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  2647. AfterEffectRemove += AuraEffectRemoveFn(spell_gen_summon_elemental_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  2648. }
  2649. private:
  2650. uint32 _spellId;
  2651. };
  2652. AuraScript* GetAuraScript() const override
  2653. {
  2654. return new spell_gen_summon_elemental_AuraScript(_spellId);
  2655. }
  2656. private:
  2657. uint32 _spellId;
  2658. };
  2659. enum TournamentMountsSpells
  2660. {
  2661. SPELL_LANCE_EQUIPPED = 62853
  2662. };
  2663. class spell_gen_summon_tournament_mount : public SpellScriptLoader
  2664. {
  2665. public:
  2666. spell_gen_summon_tournament_mount() : SpellScriptLoader("spell_gen_summon_tournament_mount") { }
  2667. class spell_gen_summon_tournament_mount_SpellScript : public SpellScript
  2668. {
  2669. PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript);
  2670. bool Validate(SpellInfo const* /*spellInfo*/) override
  2671. {
  2672. if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED))
  2673. return false;
  2674. return true;
  2675. }
  2676. SpellCastResult CheckIfLanceEquiped()
  2677. {
  2678. if (GetCaster()->IsInDisallowedMountForm())
  2679. GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
  2680. if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED))
  2681. {
  2682. SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED);
  2683. return SPELL_FAILED_CUSTOM_ERROR;
  2684. }
  2685. return SPELL_CAST_OK;
  2686. }
  2687. void Register() override
  2688. {
  2689. OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount_SpellScript::CheckIfLanceEquiped);
  2690. }
  2691. };
  2692. SpellScript* GetSpellScript() const override
  2693. {
  2694. return new spell_gen_summon_tournament_mount_SpellScript();
  2695. }
  2696. };
  2697. // 41213, 43416, 69222, 73076 - Throw Shield
  2698. class spell_gen_throw_shield : public SpellScriptLoader
  2699. {
  2700. public:
  2701. spell_gen_throw_shield() : SpellScriptLoader("spell_gen_throw_shield") { }
  2702. class spell_gen_throw_shield_SpellScript : public SpellScript
  2703. {
  2704. PrepareSpellScript(spell_gen_throw_shield_SpellScript);
  2705. void HandleScriptEffect(SpellEffIndex effIndex)
  2706. {
  2707. PreventHitDefaultEffect(effIndex);
  2708. GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
  2709. }
  2710. void Register() override
  2711. {
  2712. OnEffectHitTarget += SpellEffectFn(spell_gen_throw_shield_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
  2713. }
  2714. };
  2715. SpellScript* GetSpellScript() const override
  2716. {
  2717. return new spell_gen_throw_shield_SpellScript();
  2718. }
  2719. };
  2720. enum MountedDuelSpells
  2721. {
  2722. SPELL_ON_TOURNAMENT_MOUNT = 63034,
  2723. SPELL_MOUNTED_DUEL = 62875
  2724. };
  2725. class spell_gen_tournament_duel : public SpellScriptLoader
  2726. {
  2727. public:
  2728. spell_gen_tournament_duel() : SpellScriptLoader("spell_gen_tournament_duel") { }
  2729. class spell_gen_tournament_duel_SpellScript : public SpellScript
  2730. {
  2731. PrepareSpellScript(spell_gen_tournament_duel_SpellScript);
  2732. bool Validate(SpellInfo const* /*spellInfo*/) override
  2733. {
  2734. if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) ||
  2735. !sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL))
  2736. return false;
  2737. return true;
  2738. }
  2739. void HandleScriptEffect(SpellEffIndex /*effIndex*/)
  2740. {
  2741. if (Unit* rider = GetCaster()->GetCharmer())
  2742. {
  2743. if (Player* playerTarget = GetHitPlayer())
  2744. {
  2745. if (playerTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && playerTarget->GetVehicleBase())
  2746. rider->CastSpell(playerTarget, SPELL_MOUNTED_DUEL, true);
  2747. }
  2748. else if (Unit* unitTarget = GetHitUnit())
  2749. {
  2750. if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT))
  2751. rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true);
  2752. }
  2753. }
  2754. }
  2755. void Register() override
  2756. {
  2757. OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  2758. }
  2759. };
  2760. SpellScript* GetSpellScript() const override
  2761. {
  2762. return new spell_gen_tournament_duel_SpellScript();
  2763. }
  2764. };
  2765. class spell_gen_tournament_pennant : public SpellScriptLoader
  2766. {
  2767. public:
  2768. spell_gen_tournament_pennant() : SpellScriptLoader("spell_gen_tournament_pennant") { }
  2769. class spell_gen_tournament_pennant_AuraScript : public AuraScript
  2770. {
  2771. PrepareAuraScript(spell_gen_tournament_pennant_AuraScript);
  2772. bool Load() override
  2773. {
  2774. return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2775. }
  2776. void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  2777. {
  2778. if (Unit* caster = GetCaster())
  2779. if (!caster->GetVehicleBase())
  2780. caster->RemoveAurasDueToSpell(GetId());
  2781. }
  2782. void Register() override
  2783. {
  2784. OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  2785. }
  2786. };
  2787. AuraScript* GetAuraScript() const override
  2788. {
  2789. return new spell_gen_tournament_pennant_AuraScript();
  2790. }
  2791. };
  2792. enum PvPTrinketTriggeredSpells
  2793. {
  2794. SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER = 72752,
  2795. SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF = 72757
  2796. };
  2797. class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader
  2798. {
  2799. public:
  2800. spell_pvp_trinket_wotf_shared_cd() : SpellScriptLoader("spell_pvp_trinket_wotf_shared_cd") { }
  2801. class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript
  2802. {
  2803. PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript);
  2804. bool Load() override
  2805. {
  2806. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2807. }
  2808. bool Validate(SpellInfo const* /*spellInfo*/) override
  2809. {
  2810. if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) ||
  2811. !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF))
  2812. return false;
  2813. return true;
  2814. }
  2815. void HandleScript()
  2816. {
  2817. // This is only needed because spells cast from spell_linked_spell are triggered by default
  2818. // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
  2819. GetCaster()->GetSpellHistory()->StartCooldown(GetSpellInfo(), 0, GetSpell());
  2820. }
  2821. void Register() override
  2822. {
  2823. AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript);
  2824. }
  2825. };
  2826. SpellScript* GetSpellScript() const override
  2827. {
  2828. return new spell_pvp_trinket_wotf_shared_cd_SpellScript();
  2829. }
  2830. };
  2831. enum FriendOrFowl
  2832. {
  2833. SPELL_TURKEY_VENGEANCE = 25285
  2834. };
  2835. class spell_gen_turkey_marker : public SpellScriptLoader
  2836. {
  2837. public:
  2838. spell_gen_turkey_marker() : SpellScriptLoader("spell_gen_turkey_marker") { }
  2839. class spell_gen_turkey_marker_AuraScript : public AuraScript
  2840. {
  2841. PrepareAuraScript(spell_gen_turkey_marker_AuraScript);
  2842. void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
  2843. {
  2844. // store stack apply times, so we can pop them while they expire
  2845. _applyTimes.push_back(getMSTime());
  2846. Unit* target = GetTarget();
  2847. // on stack 15 cast the achievement crediting spell
  2848. if (GetStackAmount() >= 15)
  2849. target->CastSpell(target, SPELL_TURKEY_VENGEANCE, true, NULL, aurEff, GetCasterGUID());
  2850. }
  2851. void OnPeriodic(AuraEffect const* /*aurEff*/)
  2852. {
  2853. if (_applyTimes.empty())
  2854. return;
  2855. // pop stack if it expired for us
  2856. if (_applyTimes.front() + GetMaxDuration() < getMSTime())
  2857. ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE);
  2858. }
  2859. void Register() override
  2860. {
  2861. AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
  2862. OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
  2863. }
  2864. std::list<uint32> _applyTimes;
  2865. };
  2866. AuraScript* GetAuraScript() const override
  2867. {
  2868. return new spell_gen_turkey_marker_AuraScript();
  2869. }
  2870. };
  2871. enum FoamSword
  2872. {
  2873. ITEM_FOAM_SWORD_GREEN = 45061,
  2874. ITEM_FOAM_SWORD_PINK = 45176,
  2875. ITEM_FOAM_SWORD_BLUE = 45177,
  2876. ITEM_FOAM_SWORD_RED = 45178,
  2877. ITEM_FOAM_SWORD_YELLOW = 45179
  2878. };
  2879. class spell_gen_upper_deck_create_foam_sword : public SpellScriptLoader
  2880. {
  2881. public:
  2882. spell_gen_upper_deck_create_foam_sword() : SpellScriptLoader("spell_gen_upper_deck_create_foam_sword") { }
  2883. class spell_gen_upper_deck_create_foam_sword_SpellScript : public SpellScript
  2884. {
  2885. PrepareSpellScript(spell_gen_upper_deck_create_foam_sword_SpellScript);
  2886. void HandleScript(SpellEffIndex effIndex)
  2887. {
  2888. if (Player* player = GetHitPlayer())
  2889. {
  2890. 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 };
  2891. // player can only have one of these items
  2892. for (uint8 i = 0; i < 5; ++i)
  2893. {
  2894. if (player->HasItemCount(itemId[i], 1, true))
  2895. return;
  2896. }
  2897. CreateItem(effIndex, itemId[urand(0, 4)]);
  2898. }
  2899. }
  2900. void Register() override
  2901. {
  2902. OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  2903. }
  2904. };
  2905. SpellScript* GetSpellScript() const override
  2906. {
  2907. return new spell_gen_upper_deck_create_foam_sword_SpellScript();
  2908. }
  2909. };
  2910. enum VehicleScaling
  2911. {
  2912. SPELL_GEAR_SCALING = 66668
  2913. };
  2914. class spell_gen_vehicle_scaling : public SpellScriptLoader
  2915. {
  2916. public:
  2917. spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { }
  2918. class spell_gen_vehicle_scaling_AuraScript : public AuraScript
  2919. {
  2920. PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript);
  2921. bool Load() override
  2922. {
  2923. return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
  2924. }
  2925. void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
  2926. {
  2927. Unit* caster = GetCaster();
  2928. float factor;
  2929. uint16 baseItemLevel;
  2930. /// @todo Reserach coeffs for different vehicles
  2931. switch (GetId())
  2932. {
  2933. case SPELL_GEAR_SCALING:
  2934. factor = 1.0f;
  2935. baseItemLevel = 205;
  2936. break;
  2937. default:
  2938. factor = 1.0f;
  2939. baseItemLevel = 170;
  2940. break;
  2941. }
  2942. float avgILvl = caster->ToPlayer()->GetAverageItemLevel();
  2943. if (avgILvl < baseItemLevel)
  2944. return; /// @todo Research possibility of scaling down
  2945. amount = uint16((avgILvl - baseItemLevel) * factor);
  2946. }
  2947. void Register() override
  2948. {
  2949. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT);
  2950. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
  2951. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT);
  2952. }
  2953. };
  2954. AuraScript* GetAuraScript() const override
  2955. {
  2956. return new spell_gen_vehicle_scaling_AuraScript();
  2957. }
  2958. };
  2959. enum VendorBarkTrigger
  2960. {
  2961. NPC_AMPHITHEATER_VENDOR = 30098,
  2962. SAY_AMPHITHEATER_VENDOR = 0
  2963. };
  2964. class spell_gen_vendor_bark_trigger : public SpellScriptLoader
  2965. {
  2966. public:
  2967. spell_gen_vendor_bark_trigger() : SpellScriptLoader("spell_gen_vendor_bark_trigger") { }
  2968. class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript
  2969. {
  2970. PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript);
  2971. void HandleDummy(SpellEffIndex /* effIndex */)
  2972. {
  2973. if (Creature* vendor = GetCaster()->ToCreature())
  2974. if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR)
  2975. vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR);
  2976. }
  2977. void Register() override
  2978. {
  2979. OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  2980. }
  2981. };
  2982. SpellScript* GetSpellScript() const override
  2983. {
  2984. return new spell_gen_vendor_bark_trigger_SpellScript();
  2985. }
  2986. };
  2987. class spell_gen_wg_water : public SpellScriptLoader
  2988. {
  2989. public:
  2990. spell_gen_wg_water() : SpellScriptLoader("spell_gen_wg_water") { }
  2991. class spell_gen_wg_water_SpellScript : public SpellScript
  2992. {
  2993. PrepareSpellScript(spell_gen_wg_water_SpellScript);
  2994. SpellCastResult CheckCast()
  2995. {
  2996. if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster()))
  2997. return SPELL_FAILED_DONT_REPORT;
  2998. return SPELL_CAST_OK;
  2999. }
  3000. void Register() override
  3001. {
  3002. OnCheckCast += SpellCheckCastFn(spell_gen_wg_water_SpellScript::CheckCast);
  3003. }
  3004. };
  3005. SpellScript* GetSpellScript() const override
  3006. {
  3007. return new spell_gen_wg_water_SpellScript();
  3008. }
  3009. };
  3010. enum WhisperGulchYoggSaronWhisper
  3011. {
  3012. SPELL_YOGG_SARON_WHISPER_DUMMY = 29072
  3013. };
  3014. class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader
  3015. {
  3016. public:
  3017. spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { }
  3018. class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript
  3019. {
  3020. PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript);
  3021. bool Validate(SpellInfo const* /*spellInfo*/) override
  3022. {
  3023. if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY))
  3024. return false;
  3025. return true;
  3026. }
  3027. void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
  3028. {
  3029. PreventDefaultAction();
  3030. GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true);
  3031. }
  3032. void Register() override
  3033. {
  3034. OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
  3035. }
  3036. };
  3037. AuraScript* GetAuraScript() const override
  3038. {
  3039. return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript();
  3040. }
  3041. };
  3042. class spell_gen_eject_all_passengers : public SpellScriptLoader
  3043. {
  3044. public:
  3045. spell_gen_eject_all_passengers() : SpellScriptLoader("spell_gen_eject_all_passengers") { }
  3046. class spell_gen_eject_all_passengers_SpellScript : public SpellScript
  3047. {
  3048. PrepareSpellScript(spell_gen_eject_all_passengers_SpellScript);
  3049. void RemoveVehicleAuras()
  3050. {
  3051. if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit())
  3052. vehicle->RemoveAllPassengers();
  3053. }
  3054. void Register() override
  3055. {
  3056. AfterHit += SpellHitFn(spell_gen_eject_all_passengers_SpellScript::RemoveVehicleAuras);
  3057. }
  3058. };
  3059. SpellScript* GetSpellScript() const override
  3060. {
  3061. return new spell_gen_eject_all_passengers_SpellScript();
  3062. }
  3063. };
  3064. class spell_gen_eject_passenger : public SpellScriptLoader
  3065. {
  3066. public:
  3067. spell_gen_eject_passenger() : SpellScriptLoader("spell_gen_eject_passenger") { }
  3068. class spell_gen_eject_passenger_SpellScript : public SpellScript
  3069. {
  3070. PrepareSpellScript(spell_gen_eject_passenger_SpellScript);
  3071. bool Validate(SpellInfo const* spellInfo) override
  3072. {
  3073. if (spellInfo->Effects[EFFECT_0].CalcValue() < 1)
  3074. return false;
  3075. return true;
  3076. }
  3077. void EjectPassenger(SpellEffIndex /*effIndex*/)
  3078. {
  3079. if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit())
  3080. {
  3081. if (Unit* passenger = vehicle->GetPassenger(GetEffectValue() - 1))
  3082. passenger->ExitVehicle();
  3083. }
  3084. }
  3085. void Register() override
  3086. {
  3087. OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger_SpellScript::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  3088. }
  3089. };
  3090. SpellScript* GetSpellScript() const override
  3091. {
  3092. return new spell_gen_eject_passenger_SpellScript();
  3093. }
  3094. };
  3095. enum GMFreeze
  3096. {
  3097. SPELL_GM_FREEZE = 9454
  3098. };
  3099. class spell_gen_gm_freeze : public SpellScriptLoader
  3100. {
  3101. public:
  3102. spell_gen_gm_freeze() : SpellScriptLoader("spell_gen_gm_freeze") { }
  3103. class spell_gen_gm_freeze_AuraScript : public AuraScript
  3104. {
  3105. PrepareAuraScript(spell_gen_gm_freeze_AuraScript);
  3106. bool Validate(SpellInfo const* /*spellInfo*/) override
  3107. {
  3108. if (!sSpellMgr->GetSpellInfo(SPELL_GM_FREEZE))
  3109. return false;
  3110. return true;
  3111. }
  3112. void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  3113. {
  3114. // Do what was done before to the target in HandleFreezeCommand
  3115. if (Player* player = GetTarget()->ToPlayer())
  3116. {
  3117. // stop combat + make player unattackable + duel stop + stop some spells
  3118. player->setFaction(35);
  3119. player->CombatStop();
  3120. if (player->IsNonMeleeSpellCast(true))
  3121. player->InterruptNonMeleeSpells(true);
  3122. player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3123. // if player class = hunter || warlock remove pet if alive
  3124. if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
  3125. {
  3126. if (Pet* pet = player->GetPet())
  3127. {
  3128. pet->SavePetToDB(PET_SAVE_AS_CURRENT);
  3129. // not let dismiss dead pet
  3130. if (pet->IsAlive())
  3131. player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT);
  3132. }
  3133. }
  3134. }
  3135. }
  3136. void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  3137. {
  3138. // Do what was done before to the target in HandleUnfreezeCommand
  3139. if (Player* player = GetTarget()->ToPlayer())
  3140. {
  3141. // Reset player faction + allow combat + allow duels
  3142. player->setFactionForRace(player->getRace());
  3143. player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  3144. // save player
  3145. player->SaveToDB();
  3146. }
  3147. }
  3148. void Register() override
  3149. {
  3150. OnEffectApply += AuraEffectApplyFn(spell_gen_gm_freeze_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
  3151. OnEffectRemove += AuraEffectRemoveFn(spell_gen_gm_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
  3152. }
  3153. };
  3154. AuraScript* GetAuraScript() const override
  3155. {
  3156. return new spell_gen_gm_freeze_AuraScript();
  3157. }
  3158. };
  3159. class spell_gen_stand : public SpellScriptLoader
  3160. {
  3161. public:
  3162. spell_gen_stand() : SpellScriptLoader("spell_gen_stand") { }
  3163. class spell_gen_stand_SpellScript : public SpellScript
  3164. {
  3165. PrepareSpellScript(spell_gen_stand_SpellScript);
  3166. void HandleScript(SpellEffIndex /*eff*/)
  3167. {
  3168. Creature* target = GetHitCreature();
  3169. if (!target)
  3170. return;
  3171. target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND);
  3172. target->HandleEmoteCommand(EMOTE_STATE_NONE);
  3173. }
  3174. void Register() override
  3175. {
  3176. OnEffectHitTarget += SpellEffectFn(spell_gen_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  3177. }
  3178. };
  3179. SpellScript* GetSpellScript() const override
  3180. {
  3181. return new spell_gen_stand_SpellScript();
  3182. }
  3183. };
  3184. enum RequiredMixologySpells
  3185. {
  3186. SPELL_MIXOLOGY = 53042,
  3187. // Flasks
  3188. SPELL_FLASK_OF_THE_FROST_WYRM = 53755,
  3189. SPELL_FLASK_OF_STONEBLOOD = 53758,
  3190. SPELL_FLASK_OF_ENDLESS_RAGE = 53760,
  3191. SPELL_FLASK_OF_PURE_MOJO = 54212,
  3192. SPELL_LESSER_FLASK_OF_RESISTANCE = 62380,
  3193. SPELL_LESSER_FLASK_OF_TOUGHNESS = 53752,
  3194. SPELL_FLASK_OF_BLINDING_LIGHT = 28521,
  3195. SPELL_FLASK_OF_CHROMATIC_WONDER = 42735,
  3196. SPELL_FLASK_OF_FORTIFICATION = 28518,
  3197. SPELL_FLASK_OF_MIGHTY_RESTORATION = 28519,
  3198. SPELL_FLASK_OF_PURE_DEATH = 28540,
  3199. SPELL_FLASK_OF_RELENTLESS_ASSAULT = 28520,
  3200. SPELL_FLASK_OF_CHROMATIC_RESISTANCE = 17629,
  3201. SPELL_FLASK_OF_DISTILLED_WISDOM = 17627,
  3202. SPELL_FLASK_OF_SUPREME_POWER = 17628,
  3203. SPELL_FLASK_OF_THE_TITANS = 17626,
  3204. // Elixirs
  3205. SPELL_ELIXIR_OF_MIGHTY_AGILITY = 28497,
  3206. SPELL_ELIXIR_OF_ACCURACY = 60340,
  3207. SPELL_ELIXIR_OF_DEADLY_STRIKES = 60341,
  3208. SPELL_ELIXIR_OF_MIGHTY_DEFENSE = 60343,
  3209. SPELL_ELIXIR_OF_EXPERTISE = 60344,
  3210. SPELL_ELIXIR_OF_ARMOR_PIERCING = 60345,
  3211. SPELL_ELIXIR_OF_LIGHTNING_SPEED = 60346,
  3212. SPELL_ELIXIR_OF_MIGHTY_FORTITUDE = 53751,
  3213. SPELL_ELIXIR_OF_MIGHTY_MAGEBLOOD = 53764,
  3214. SPELL_ELIXIR_OF_MIGHTY_STRENGTH = 53748,
  3215. SPELL_ELIXIR_OF_MIGHTY_TOUGHTS = 60347,
  3216. SPELL_ELIXIR_OF_PROTECTION = 53763,
  3217. SPELL_ELIXIR_OF_SPIRIT = 53747,
  3218. SPELL_GURUS_ELIXIR = 53749,
  3219. SPELL_SHADOWPOWER_ELIXIR = 33721,
  3220. SPELL_WRATH_ELIXIR = 53746,
  3221. SPELL_ELIXIR_OF_EMPOWERMENT = 28514,
  3222. SPELL_ELIXIR_OF_MAJOR_MAGEBLOOD = 28509,
  3223. SPELL_ELIXIR_OF_MAJOR_SHADOW_POWER = 28503,
  3224. SPELL_ELIXIR_OF_MAJOR_DEFENSE = 28502,
  3225. SPELL_FEL_STRENGTH_ELIXIR = 38954,
  3226. SPELL_ELIXIR_OF_IRONSKIN = 39628,
  3227. SPELL_ELIXIR_OF_MAJOR_AGILITY = 54494,
  3228. SPELL_ELIXIR_OF_DRAENIC_WISDOM = 39627,
  3229. SPELL_ELIXIR_OF_MAJOR_FIREPOWER = 28501,
  3230. SPELL_ELIXIR_OF_MAJOR_FROST_POWER = 28493,
  3231. SPELL_EARTHEN_ELIXIR = 39626,
  3232. SPELL_ELIXIR_OF_MASTERY = 33726,
  3233. SPELL_ELIXIR_OF_HEALING_POWER = 28491,
  3234. SPELL_ELIXIR_OF_MAJOR_FORTITUDE = 39625,
  3235. SPELL_ELIXIR_OF_MAJOR_STRENGTH = 28490,
  3236. SPELL_ADEPTS_ELIXIR = 54452,
  3237. SPELL_ONSLAUGHT_ELIXIR = 33720,
  3238. SPELL_MIGHTY_TROLLS_BLOOD_ELIXIR = 24361,
  3239. SPELL_GREATER_ARCANE_ELIXIR = 17539,
  3240. SPELL_ELIXIR_OF_THE_MONGOOSE = 17538,
  3241. SPELL_ELIXIR_OF_BRUTE_FORCE = 17537,
  3242. SPELL_ELIXIR_OF_SAGES = 17535,
  3243. SPELL_ELIXIR_OF_SUPERIOR_DEFENSE = 11348,
  3244. SPELL_ELIXIR_OF_DEMONSLAYING = 11406,
  3245. SPELL_ELIXIR_OF_GREATER_FIREPOWER = 26276,
  3246. SPELL_ELIXIR_OF_SHADOW_POWER = 11474,
  3247. SPELL_MAGEBLOOD_ELIXIR = 24363,
  3248. SPELL_ELIXIR_OF_GIANTS = 11405,
  3249. SPELL_ELIXIR_OF_GREATER_AGILITY = 11334,
  3250. SPELL_ARCANE_ELIXIR = 11390,
  3251. SPELL_ELIXIR_OF_GREATER_INTELLECT = 11396,
  3252. SPELL_ELIXIR_OF_GREATER_DEFENSE = 11349,
  3253. SPELL_ELIXIR_OF_FROST_POWER = 21920,
  3254. SPELL_ELIXIR_OF_AGILITY = 11328,
  3255. SPELL_MAJOR_TROLLS_BLLOOD_ELIXIR = 3223,
  3256. SPELL_ELIXIR_OF_FORTITUDE = 3593,
  3257. SPELL_ELIXIR_OF_OGRES_STRENGTH = 3164,
  3258. SPELL_ELIXIR_OF_FIREPOWER = 7844,
  3259. SPELL_ELIXIR_OF_LESSER_AGILITY = 3160,
  3260. SPELL_ELIXIR_OF_DEFENSE = 3220,
  3261. SPELL_STRONG_TROLLS_BLOOD_ELIXIR = 3222,
  3262. SPELL_ELIXIR_OF_MINOR_ACCURACY = 63729,
  3263. SPELL_ELIXIR_OF_WISDOM = 3166,
  3264. SPELL_ELIXIR_OF_GIANTH_GROWTH = 8212,
  3265. SPELL_ELIXIR_OF_MINOR_AGILITY = 2374,
  3266. SPELL_ELIXIR_OF_MINOR_FORTITUDE = 2378,
  3267. SPELL_WEAK_TROLLS_BLOOD_ELIXIR = 3219,
  3268. SPELL_ELIXIR_OF_LIONS_STRENGTH = 2367,
  3269. SPELL_ELIXIR_OF_MINOR_DEFENSE = 673
  3270. };
  3271. class spell_gen_mixology_bonus : public SpellScriptLoader
  3272. {
  3273. public:
  3274. spell_gen_mixology_bonus() : SpellScriptLoader("spell_gen_mixology_bonus") { }
  3275. class spell_gen_mixology_bonus_AuraScript : public AuraScript
  3276. {
  3277. PrepareAuraScript(spell_gen_mixology_bonus_AuraScript);
  3278. public:
  3279. spell_gen_mixology_bonus_AuraScript()
  3280. {
  3281. bonus = 0;
  3282. }
  3283. private:
  3284. bool Validate(SpellInfo const* /*spellInfo*/) override
  3285. {
  3286. if (!sSpellMgr->GetSpellInfo(SPELL_MIXOLOGY))
  3287. return false;
  3288. return true;
  3289. }
  3290. bool Load() override
  3291. {
  3292. return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
  3293. }
  3294. void SetBonusValueForEffect(SpellEffIndex effIndex, int32 value, AuraEffect const* aurEff)
  3295. {
  3296. if (aurEff->GetEffIndex() == uint32(effIndex))
  3297. bonus = value;
  3298. }
  3299. void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
  3300. {
  3301. if (GetCaster()->HasAura(SPELL_MIXOLOGY) && GetCaster()->HasSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell))
  3302. {
  3303. switch (GetId())
  3304. {
  3305. case SPELL_WEAK_TROLLS_BLOOD_ELIXIR:
  3306. case SPELL_MAGEBLOOD_ELIXIR:
  3307. bonus = amount;
  3308. break;
  3309. case SPELL_ELIXIR_OF_FROST_POWER:
  3310. case SPELL_LESSER_FLASK_OF_TOUGHNESS:
  3311. case SPELL_LESSER_FLASK_OF_RESISTANCE:
  3312. bonus = CalculatePct(amount, 80);
  3313. break;
  3314. case SPELL_ELIXIR_OF_MINOR_DEFENSE:
  3315. case SPELL_ELIXIR_OF_LIONS_STRENGTH:
  3316. case SPELL_ELIXIR_OF_MINOR_AGILITY:
  3317. case SPELL_MAJOR_TROLLS_BLLOOD_ELIXIR:
  3318. case SPELL_ELIXIR_OF_SHADOW_POWER:
  3319. case SPELL_ELIXIR_OF_BRUTE_FORCE:
  3320. case SPELL_MIGHTY_TROLLS_BLOOD_ELIXIR:
  3321. case SPELL_ELIXIR_OF_GREATER_FIREPOWER:
  3322. case SPELL_ONSLAUGHT_ELIXIR:
  3323. case SPELL_EARTHEN_ELIXIR:
  3324. case SPELL_ELIXIR_OF_MAJOR_AGILITY:
  3325. case SPELL_FLASK_OF_THE_TITANS:
  3326. case SPELL_FLASK_OF_RELENTLESS_ASSAULT:
  3327. case SPELL_FLASK_OF_STONEBLOOD:
  3328. case SPELL_ELIXIR_OF_MINOR_ACCURACY:
  3329. bonus = CalculatePct(amount, 50);
  3330. break;
  3331. case SPELL_ELIXIR_OF_PROTECTION:
  3332. bonus = 280;
  3333. break;
  3334. case SPELL_ELIXIR_OF_MAJOR_DEFENSE:
  3335. bonus = 200;
  3336. break;
  3337. case SPELL_ELIXIR_OF_GREATER_DEFENSE:
  3338. case SPELL_ELIXIR_OF_SUPERIOR_DEFENSE:
  3339. bonus = 140;
  3340. break;
  3341. case SPELL_ELIXIR_OF_FORTITUDE:
  3342. bonus = 100;
  3343. break;
  3344. case SPELL_FLASK_OF_ENDLESS_RAGE:
  3345. bonus = 82;
  3346. break;
  3347. case SPELL_ELIXIR_OF_DEFENSE:
  3348. bonus = 70;
  3349. break;
  3350. case SPELL_ELIXIR_OF_DEMONSLAYING:
  3351. bonus = 50;
  3352. break;
  3353. case SPELL_FLASK_OF_THE_FROST_WYRM:
  3354. bonus = 47;
  3355. break;
  3356. case SPELL_WRATH_ELIXIR:
  3357. bonus = 32;
  3358. break;
  3359. case SPELL_ELIXIR_OF_MAJOR_FROST_POWER:
  3360. case SPELL_ELIXIR_OF_MAJOR_FIREPOWER:
  3361. case SPELL_ELIXIR_OF_MAJOR_SHADOW_POWER:
  3362. bonus = 29;
  3363. break;
  3364. case SPELL_ELIXIR_OF_MIGHTY_TOUGHTS:
  3365. bonus = 27;
  3366. break;
  3367. case SPELL_FLASK_OF_SUPREME_POWER:
  3368. case SPELL_FLASK_OF_BLINDING_LIGHT:
  3369. case SPELL_FLASK_OF_PURE_DEATH:
  3370. case SPELL_SHADOWPOWER_ELIXIR:
  3371. bonus = 23;
  3372. break;
  3373. case SPELL_ELIXIR_OF_MIGHTY_AGILITY:
  3374. case SPELL_FLASK_OF_DISTILLED_WISDOM:
  3375. case SPELL_ELIXIR_OF_SPIRIT:
  3376. case SPELL_ELIXIR_OF_MIGHTY_STRENGTH:
  3377. case SPELL_FLASK_OF_PURE_MOJO:
  3378. case SPELL_ELIXIR_OF_ACCURACY:
  3379. case SPELL_ELIXIR_OF_DEADLY_STRIKES:
  3380. case SPELL_ELIXIR_OF_MIGHTY_DEFENSE:
  3381. case SPELL_ELIXIR_OF_EXPERTISE:
  3382. case SPELL_ELIXIR_OF_ARMOR_PIERCING:
  3383. case SPELL_ELIXIR_OF_LIGHTNING_SPEED:
  3384. bonus = 20;
  3385. break;
  3386. case SPELL_FLASK_OF_CHROMATIC_RESISTANCE:
  3387. bonus = 17;
  3388. break;
  3389. case SPELL_ELIXIR_OF_MINOR_FORTITUDE:
  3390. case SPELL_ELIXIR_OF_MAJOR_STRENGTH:
  3391. bonus = 15;
  3392. break;
  3393. case SPELL_FLASK_OF_MIGHTY_RESTORATION:
  3394. bonus = 13;
  3395. break;
  3396. case SPELL_ARCANE_ELIXIR:
  3397. bonus = 12;
  3398. break;
  3399. case SPELL_ELIXIR_OF_GREATER_AGILITY:
  3400. case SPELL_ELIXIR_OF_GIANTS:
  3401. bonus = 11;
  3402. break;
  3403. case SPELL_ELIXIR_OF_AGILITY:
  3404. case SPELL_ELIXIR_OF_GREATER_INTELLECT:
  3405. case SPELL_ELIXIR_OF_SAGES:
  3406. case SPELL_ELIXIR_OF_IRONSKIN:
  3407. case SPELL_ELIXIR_OF_MIGHTY_MAGEBLOOD:
  3408. bonus = 10;
  3409. break;
  3410. case SPELL_ELIXIR_OF_HEALING_POWER:
  3411. bonus = 9;
  3412. break;
  3413. case SPELL_ELIXIR_OF_DRAENIC_WISDOM:
  3414. case SPELL_GURUS_ELIXIR:
  3415. bonus = 8;
  3416. break;
  3417. case SPELL_ELIXIR_OF_FIREPOWER:
  3418. case SPELL_ELIXIR_OF_MAJOR_MAGEBLOOD:
  3419. case SPELL_ELIXIR_OF_MASTERY:
  3420. bonus = 6;
  3421. break;
  3422. case SPELL_ELIXIR_OF_LESSER_AGILITY:
  3423. case SPELL_ELIXIR_OF_OGRES_STRENGTH:
  3424. case SPELL_ELIXIR_OF_WISDOM:
  3425. case SPELL_ELIXIR_OF_THE_MONGOOSE:
  3426. bonus = 5;
  3427. break;
  3428. case SPELL_STRONG_TROLLS_BLOOD_ELIXIR:
  3429. case SPELL_FLASK_OF_CHROMATIC_WONDER:
  3430. bonus = 4;
  3431. break;
  3432. case SPELL_ELIXIR_OF_EMPOWERMENT:
  3433. bonus = -10;
  3434. break;
  3435. case SPELL_ADEPTS_ELIXIR:
  3436. SetBonusValueForEffect(EFFECT_0, 13, aurEff);
  3437. SetBonusValueForEffect(EFFECT_1, 13, aurEff);
  3438. SetBonusValueForEffect(EFFECT_2, 8, aurEff);
  3439. break;
  3440. case SPELL_ELIXIR_OF_MIGHTY_FORTITUDE:
  3441. SetBonusValueForEffect(EFFECT_0, 160, aurEff);
  3442. break;
  3443. case SPELL_ELIXIR_OF_MAJOR_FORTITUDE:
  3444. SetBonusValueForEffect(EFFECT_0, 116, aurEff);
  3445. SetBonusValueForEffect(EFFECT_1, 6, aurEff);
  3446. break;
  3447. case SPELL_FEL_STRENGTH_ELIXIR:
  3448. SetBonusValueForEffect(EFFECT_0, 40, aurEff);
  3449. SetBonusValueForEffect(EFFECT_1, 40, aurEff);
  3450. break;
  3451. case SPELL_FLASK_OF_FORTIFICATION:
  3452. SetBonusValueForEffect(EFFECT_0, 210, aurEff);
  3453. SetBonusValueForEffect(EFFECT_1, 5, aurEff);
  3454. break;
  3455. case SPELL_GREATER_ARCANE_ELIXIR:
  3456. SetBonusValueForEffect(EFFECT_0, 19, aurEff);
  3457. SetBonusValueForEffect(EFFECT_1, 19, aurEff);
  3458. SetBonusValueForEffect(EFFECT_2, 5, aurEff);
  3459. break;
  3460. case SPELL_ELIXIR_OF_GIANTH_GROWTH:
  3461. SetBonusValueForEffect(EFFECT_0, 5, aurEff);
  3462. break;
  3463. default:
  3464. TC_LOG_ERROR("spells", "SpellId %u couldn't be processed in spell_gen_mixology_bonus", GetId());
  3465. break;
  3466. }
  3467. amount += bonus;
  3468. }
  3469. }
  3470. int32 bonus;
  3471. void Register() override
  3472. {
  3473. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_mixology_bonus_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY);
  3474. }
  3475. };
  3476. AuraScript* GetAuraScript() const override
  3477. {
  3478. return new spell_gen_mixology_bonus_AuraScript();
  3479. }
  3480. };
  3481. void AddSC_generic_spell_scripts()
  3482. {
  3483. new spell_gen_absorb0_hitlimit1();
  3484. new spell_gen_adaptive_warding();
  3485. new spell_gen_alchemist_stone();
  3486. new spell_gen_allow_cast_from_item_only();
  3487. new spell_gen_animal_blood();
  3488. new spell_gen_aura_of_anger();
  3489. new spell_gen_aura_service_uniform();
  3490. new spell_gen_av_drekthar_presence();
  3491. new spell_gen_bandage();
  3492. new spell_gen_bonked();
  3493. new spell_gen_break_shield("spell_gen_break_shield");
  3494. new spell_gen_break_shield("spell_gen_tournament_counterattack");
  3495. new spell_gen_burn_brutallus();
  3496. new spell_gen_cannibalize();
  3497. new spell_gen_chaos_blast();
  3498. new spell_gen_clone();
  3499. new spell_gen_clone_weapon();
  3500. new spell_gen_clone_weapon_aura();
  3501. new spell_gen_count_pct_from_max_hp("spell_gen_default_count_pct_from_max_hp");
  3502. new spell_gen_count_pct_from_max_hp("spell_gen_50pct_count_pct_from_max_hp", 50);
  3503. new spell_gen_create_lance();
  3504. new spell_gen_creature_permanent_feign_death();
  3505. new spell_gen_dalaran_disguise("spell_gen_sunreaver_disguise");
  3506. new spell_gen_dalaran_disguise("spell_gen_silver_covenant_disguise");
  3507. new spell_gen_defend();
  3508. new spell_gen_despawn_self();
  3509. new spell_gen_divine_storm_cd_reset();
  3510. new spell_gen_ds_flush_knockback();
  3511. new spell_gen_dummy_trigger();
  3512. new spell_gen_dungeon_credit();
  3513. new spell_gen_elune_candle();
  3514. new spell_gen_gadgetzan_transporter_backfire();
  3515. new spell_gen_gift_of_naaru();
  3516. new spell_gen_gnomish_transporter();
  3517. new spell_gen_increase_stats_buff("spell_pal_blessing_of_kings");
  3518. new spell_gen_increase_stats_buff("spell_pal_blessing_of_might");
  3519. new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild");
  3520. new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude");
  3521. new spell_gen_increase_stats_buff("spell_pri_shadow_protection");
  3522. new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance");
  3523. new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance");
  3524. new spell_gen_interrupt();
  3525. new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL);
  3526. new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL);
  3527. new spell_gen_lifebloom("spell_cenarion_scout_lifebloom", SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL);
  3528. new spell_gen_lifebloom("spell_twisted_visage_lifebloom", SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL);
  3529. new spell_gen_lifebloom("spell_faction_champion_dru_lifebloom", SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL);
  3530. new spell_gen_mounted_charge();
  3531. new spell_gen_netherbloom();
  3532. new spell_gen_obsidian_armor();
  3533. new spell_gen_on_tournament_mount();
  3534. new spell_gen_oracle_wolvar_reputation();
  3535. new spell_gen_orc_disguise();
  3536. new spell_gen_parachute();
  3537. new spell_gen_pet_summoned();
  3538. new spell_gen_profession_research();
  3539. new spell_gen_remove_flight_auras();
  3540. new spell_gen_replenishment();
  3541. // Running Wild
  3542. new spell_gen_running_wild();
  3543. new spell_gen_two_forms();
  3544. new spell_gen_darkflight();
  3545. /* */
  3546. new spell_gen_seaforium_blast();
  3547. new spell_gen_spectator_cheer_trigger();
  3548. new spell_gen_spirit_healer_res();
  3549. new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL);
  3550. new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL);
  3551. new spell_gen_summon_tournament_mount();
  3552. new spell_gen_throw_shield();
  3553. new spell_gen_tournament_duel();
  3554. new spell_gen_tournament_pennant();
  3555. new spell_pvp_trinket_wotf_shared_cd();
  3556. new spell_gen_turkey_marker();
  3557. new spell_gen_upper_deck_create_foam_sword();
  3558. new spell_gen_vehicle_scaling();
  3559. new spell_gen_vendor_bark_trigger();
  3560. new spell_gen_wg_water();
  3561. new spell_gen_whisper_gulch_yogg_saron_whisper();
  3562. new spell_gen_eject_all_passengers();
  3563. new spell_gen_eject_passenger();
  3564. new spell_gen_gm_freeze();
  3565. new spell_gen_stand();
  3566. new spell_gen_mixology_bonus();
  3567. }