TrinityCore
Loading...
Searching...
No Matches
spell_quest.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
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/*
19 * Scripts for spells with SPELLFAMILY_GENERIC spells used for quests.
20 * This file is only for spells used in multiple zones.
21 * Scriptnames of files in this file should be prefixed with "spell_quest_".
22 */
23
24#include "ScriptMgr.h"
25#include "Creature.h"
26#include "ObjectMgr.h"
27#include "Player.h"
28#include "SpellAuras.h"
29#include "SpellScript.h"
30
70
72{
97
98 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
99 {
100 if (!GetCaster() || !GetCaster()->IsAlive() || !GetTarget()->IsAlive())
101 return;
102
103 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
104 return;
105
106 uint32 finalSpellId = 0;
107 switch (GetId())
108 {
109 case SPELL_TAME_ICE_CLAW_BEAR: finalSpellId = SPELL_TAME_ICE_CLAW_BEAR_1; break;
111 case SPELL_TAME_SNOW_LEOPARD: finalSpellId = SPELL_TAME_SNOW_LEOPARD_1; break;
114 case SPELL_TAME_SWOOP: finalSpellId = SPELL_TAME_SWOOP_1; break;
115 case SPELL_TAME_WEBWOOD_LURKER: finalSpellId = SPELL_TAME_WEBWOOD_LURKER_1; break;
117 case SPELL_TAME_SURF_CRAWLER: finalSpellId = SPELL_TAME_SURF_CRAWLER_1; break;
121 case SPELL_TAME_BARBED_CRAWLER: finalSpellId = SPELL_TAME_BARBED_CRAWLER_1; break;
123 case SPELL_TAME_NIGHTSTALKER: finalSpellId = SPELL_TAME_NIGHTSTALKER_1; break;
126 case SPELL_TAME_MISTBAT: finalSpellId = SPELL_TAME_MISTBAT_1; break;
127 }
128
129 if (finalSpellId)
130 GetCaster()->CastSpell(GetTarget(), finalSpellId, true);
131 }
132
137};
138
139// 53099, 57896, 58418, 58420, 59064, 59065, 59439, 60900, 60940
141{
142 bool Validate(SpellInfo const* spellInfo) override
143 {
144 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
146 && sObjectMgr->GetQuestTemplate(uint32(spellInfo->GetEffect(EFFECT_1).CalcValueAsInt()));
147 }
148
150 {
151 Player* target = GetHitPlayer();
152 if (!target)
153 return;
154
155 uint32 spellId = GetEffectInfo().CalcValueAsInt();
157
158 // This probably should be a way to throw error in SpellCastResult
159 if (target->IsActiveQuest(questId))
160 target->CastSpell(target, spellId, true);
161 }
162
167};
168
182
183// 24194 - Uther's Tribute
184// 24195 - Grom's Tribute
186{
198
199 void HandleScript(SpellEffIndex /*effIndex*/)
200 {
201 Player* caster = GetCaster()->ToPlayer();
202 if (!caster)
203 return;
204
205 uint32 spell = 0;
206 switch (caster->GetRace())
207 {
208 case RACE_TROLL: spell = SPELL_GROMS_TROLL_TRIBUTE; break;
209 case RACE_TAUREN: spell = SPELL_GROMS_TAUREN_TRIBUTE; break;
211 case RACE_ORC: spell = SPELL_GROMS_ORC_TRIBUTE; break;
212 case RACE_BLOODELF: spell = SPELL_GROMS_BLOODELF_TRIBUTE; break;
213 case RACE_HUMAN: spell = SPELL_UTHERS_HUMAN_TRIBUTE; break;
214 case RACE_GNOME: spell = SPELL_UTHERS_GNOME_TRIBUTE; break;
215 case RACE_DWARF: spell = SPELL_UTHERS_DWARF_TRIBUTE; break;
216 case RACE_NIGHTELF: spell = SPELL_UTHERS_NIGHTELF_TRIBUTE; break;
217 case RACE_DRAENEI: spell = SPELL_UTHERS_DRAENEI_TRIBUTE; break;
218 default: break;
219 }
220
221 if (spell)
222 caster->CastSpell(caster, spell);
223 }
224
229};
230
235
236// 66744 - Make Player Destroy Totems
238{
239 bool Validate(SpellInfo const* /*spellInfo*/) override
240 {
242 }
243
244 void HandleScript(SpellEffIndex /*effIndex*/)
245 {
246 // Ignore reagent cost, consumed by quest
248 }
249
254};
255
256/*######
257## Quest 14386 Leader of the Pack
258######*/
259
264
265// 68682 Call Attack Mastiffs
267{
269 {
270 Unit* caster = GetCaster();
271 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1944.573f, 2657.402f, 0.994939f, 1.691919f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
272 caster->SummonCreature(NPC_ATTACK_MASTIFF, -2005.65f, 2663.526f, -2.086935f, 0.5942355f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
273 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1996.506f, 2651.347f, -1.011707f, 0.8185352f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
274 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1972.352f, 2640.07f, 1.080288f, 1.217854f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
275 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1949.322f, 2642.76f, 1.242482f, 1.58074f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
276 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1993.94f, 2672.535f, -2.322549f, 0.5766209f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
277 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1982.724f, 2662.8f, -1.773986f, 0.8628055f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
278 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1973.301f, 2655.475f, -0.7831049f, 1.098415f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
279 caster->SummonCreature(NPC_ATTACK_MASTIFF, -1956.509f, 2650.655f, 1.350571f, 1.441473f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s);
280 }
281
286};
287
293
294// 93072 - Get Our Boys Back Dummy
296{
297 bool Validate(SpellInfo const* /*spellInfo*/) override
298 {
300 }
301
303 {
304 Unit* caster = GetCaster();
305
306 if (Creature* injuredStormwindInfantry = caster->FindNearestCreature(NPC_INJURED_STORMWIND_INFANTRY, 5.0f, true))
307 {
308 injuredStormwindInfantry->SetCreatorGUID(caster->GetGUID());
309 injuredStormwindInfantry->CastSpell(injuredStormwindInfantry, SPELL_RENEWED_LIFE, true);
310 }
311 }
312
317};
318
319// 53034 - Set Health Random
321{
323 {
324 Unit* caster = GetCaster();
325 caster->SetHealth(caster->CountPctFromMaxHealth(urand(3, 5) * 10));
326 }
327
332};
333
uint32_t uint32
Definition Define.h:154
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
#define sObjectMgr
Definition ObjectMgr.h:1873
@ RACE_TROLL
Definition RaceMask.h:37
@ RACE_UNDEAD_PLAYER
Definition RaceMask.h:34
@ RACE_ORC
Definition RaceMask.h:31
@ RACE_DRAENEI
Definition RaceMask.h:40
@ RACE_NIGHTELF
Definition RaceMask.h:33
@ RACE_BLOODELF
Definition RaceMask.h:39
@ RACE_DWARF
Definition RaceMask.h:32
@ RACE_GNOME
Definition RaceMask.h:36
@ RACE_HUMAN
Definition RaceMask.h:30
@ RACE_TAUREN
Definition RaceMask.h:35
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DUMMY
@ TRIGGERED_IGNORE_REAGENT_COST
Will ignore reagent cost.
#define SpellEffectFn(F, I, N)
#define SpellCastFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Unit * GetCaster() const
Unit * GetTarget() const
uint32 GetId() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
Player * ToPlayer()
Definition Object.h:126
bool IsActiveQuest(uint32 quest_id) const
Definition Player.cpp:14434
int32 CalcValueAsInt(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:590
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > OnCast
Definition Unit.h:647
void SetHealth(uint64 val)
Definition Unit.cpp:10041
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:809
uint8 GetRace() const
Definition Unit.h:773
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1403
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1522
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void HandleScriptEffect(SpellEffIndex)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
TamingTheBeast
@ SPELL_TAME_SURF_CRAWLER
@ SPELL_TAME_SNOW_LEOPARD_1
@ SPELL_TAME_GREATER_TIMBERSTRIDER_1
@ SPELL_TAME_ELDER_SPRINGPAW_1
@ SPELL_TAME_PRAIRIE_STALKER
@ SPELL_TAME_WEBWOOD_LURKER_1
@ SPELL_TAME_LARGE_CRAG_BOAR
@ SPELL_TAME_MISTBAT
@ SPELL_TAME_STRIGID_SCREECHER_1
@ SPELL_TAME_NIGHTSTALKER_1
@ SPELL_TAME_NIGHTSABER_STALKER
@ SPELL_TAME_ELDER_SPRINGPAW
@ SPELL_TAME_ARMORED_SCORPID
@ SPELL_TAME_ICE_CLAW_BEAR
@ SPELL_TAME_CRAZED_DRAGONHAWK_1
@ SPELL_TAME_CRAZED_DRAGONHAWK
@ SPELL_TAME_ICE_CLAW_BEAR_1
@ SPELL_TAME_ARMORED_SCORPID_1
@ SPELL_TAME_WEBWOOD_LURKER
@ SPELL_TAME_DIRE_MOTTLED_BOAR_1
@ SPELL_TAME_STRIGID_SCREECHER
@ SPELL_TAME_BARBED_CRAWLER
@ SPELL_TAME_SWOOP
@ SPELL_TAME_SURF_CRAWLER_1
@ SPELL_TAME_LARGE_CRAG_BOAR_1
@ SPELL_TAME_NIGHTSTALKER
@ SPELL_TAME_BARBED_CRAWLER_1
@ SPELL_TAME_ADULT_PLAINSTRIDER
@ SPELL_TAME_GREATER_TIMBERSTRIDER
@ SPELL_TAME_SWOOP_1
@ SPELL_TAME_DIRE_MOTTLED_BOAR
@ SPELL_TAME_PRAIRIE_STALKER_1
@ SPELL_TAME_NIGHTSABER_STALKER_1
@ SPELL_TAME_SNOW_LEOPARD
@ SPELL_TAME_MISTBAT_1
@ SPELL_TAME_ADULT_PLAINSTRIDER_1
TributeSpells
@ SPELL_UTHERS_DRAENEI_TRIBUTE
@ SPELL_GROMS_TAUREN_TRIBUTE
@ SPELL_UTHERS_HUMAN_TRIBUTE
@ SPELL_UTHERS_GNOME_TRIBUTE
@ SPELL_UTHERS_NIGHTELF_TRIBUTE
@ SPELL_GROMS_ORC_TRIBUTE
@ SPELL_GROMS_TROLL_TRIBUTE
@ SPELL_GROMS_BLOODELF_TRIBUTE
@ SPELL_UTHERS_DWARF_TRIBUTE
@ SPELL_GROMS_UNDEAD_TRIBUTE
CallAttackMastiffs
@ NPC_ATTACK_MASTIFF
RelicOfTheEarthenRing
@ SPELL_TOTEM_OF_THE_EARTHEN_RING
FearNoEvil
@ NPC_INJURED_STORMWIND_INFANTRY
@ SPELL_RENEWED_LIFE
void AddSC_quest_spell_scripts()