Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_tomb_of_seven.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "ScriptedGossip.h"
9#include "blackrock_depths.h"
10#include "Player.h"
11
17
19{
21};
22
23enum Misc
24{
26};
27
28#define GOSSIP_ITEM_TEACH_1 "Teach me the art of smelting dark iron"
29#define GOSSIP_ITEM_TEACH_2 "Continue..."
30#define GOSSIP_ITEM_TEACH_3 "[PH] Continue..."
31#define GOSSIP_ITEM_TRIBUTE "I want to pay tribute"
32
34{
35public:
36 boss_gloomrel() : CreatureScript("boss_gloomrel") { }
37
38 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
39 {
40 player->PlayerTalkClass->ClearMenus();
41 switch (action)
42 {
45 player->SEND_GOSSIP_MENU(2606, creature->GetGUID());
46 break;
48 player->CLOSE_GOSSIP_MENU();
49 player->CastSpell(player, SPELL_LEARN_SMELT, false);
50 break;
53 player->SEND_GOSSIP_MENU(2604, creature->GetGUID());
54 break;
56 player->CLOSE_GOSSIP_MENU();
57 if (InstanceScript* instance = creature->GetInstanceScript())
58 {
59 //are 5 minutes expected? go template may have data to despawn when used at quest
60 instance->DoRespawnGameObject(instance->GetData64(DATA_GO_CHALICE), MINUTE*5);
61 }
62 break;
63 }
64 return true;
65 }
66
67 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
68 {
69 if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON))
71
72 if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN)
74
75 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
76 return true;
77 }
78};
79
88
89#define GOSSIP_ITEM_CHALLENGE "Your bondage is at an end, Doom'rel. I challenge you!"
90#define GOSSIP_SELECT_DOOMREL "[PH] Continue..."
91
93{
94public:
95 boss_doomrel() : CreatureScript("boss_doomrel") { }
96
97 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
98 {
99 player->PlayerTalkClass->ClearMenus();
100 switch (action)
101 {
104 player->SEND_GOSSIP_MENU(2605, creature->GetGUID());
105 break;
107 player->CLOSE_GOSSIP_MENU();
108 //start event here
109 creature->setFaction(FACTION_HOSTILE);
110 creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
111 creature->AI()->AttackStart(player);
112 InstanceScript* instance = creature->GetInstanceScript();
113 if (instance)
114 instance->SetData64(DATA_EVENSTARTER, player->GetGUID());
115 break;
116 }
117 return true;
118 }
119
120 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
121 {
123 player->SEND_GOSSIP_MENU(2601, creature->GetGUID());
124
125 return true;
126 }
127
129 {
130 return new boss_doomrelAI(creature);
131 }
132
134 {
135 boss_doomrelAI(Creature* creature) : ScriptedAI(creature)
136 {
137 instance = creature->GetInstanceScript();
138 }
139
146
148 {
149 ShadowVolley_Timer = 10000;
150 Immolate_Timer = 18000;
152 DemonArmor_Timer = 16000;
153 Voidwalkers = false;
154
155 me->setFaction(FACTION_FRIEND);
156
157 // was set before event start, so set again
159
160 if (instance)
161 {
162 if (instance->GetData(DATA_GHOSTKILL) >= 7)
164 else
166 }
167 }
168
169 void EnterCombat(Unit* /*who*/) OVERRIDE
170 {
171 }
172
174 {
175 me->RemoveAllAuras();
176 me->DeleteThreatList();
177 me->CombatStop(true);
178 me->LoadCreaturesAddon();
179 if (me->IsAlive())
180 me->GetMotionMaster()->MoveTargetedHome();
181 me->SetLootRecipient(NULL);
182 if (instance)
183 instance->SetData64(DATA_EVENSTARTER, 0);
184 }
185
186 void JustDied(Unit* /*killer*/) OVERRIDE
187 {
188 if (instance)
189 instance->SetData(DATA_GHOSTKILL, 1);
190 }
191
193 {
194 if (!UpdateVictim())
195 return;
196
197 //ShadowVolley_Timer
198 if (ShadowVolley_Timer <= diff)
199 {
201 ShadowVolley_Timer = 12000;
202 } else ShadowVolley_Timer -= diff;
203
204 //Immolate_Timer
205 if (Immolate_Timer <= diff)
206 {
207 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
208 DoCast(target, SPELL_IMMOLATE);
209
210 Immolate_Timer = 25000;
211 } else Immolate_Timer -= diff;
212
213 //CurseOfWeakness_Timer
214 if (CurseOfWeakness_Timer <= diff)
215 {
217 CurseOfWeakness_Timer = 45000;
218 } else CurseOfWeakness_Timer -= diff;
219
220 //DemonArmor_Timer
221 if (DemonArmor_Timer <= diff)
222 {
224 DemonArmor_Timer = 300000;
225 } else DemonArmor_Timer -= diff;
226
227 //Summon Voidwalkers
228 if (!Voidwalkers && HealthBelowPct(51))
229 {
231 Voidwalkers = true;
232 }
233
235 }
236 };
237};
238
240{
241 new boss_gloomrel();
242 new boss_doomrel();
243}
@ MINUTE
Definition Common.h:119
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ SKILL_MINING
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ UNIT_NPC_FLAG_NONE
Definition Unit.h:686
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ FACTION_HOSTILE
@ FACTION_FRIEND
@ DATA_EVENSTARTER
@ DATA_GHOSTKILL
@ DATA_GO_CHALICE
@ SPELL_CURSEOFWEAKNESS
@ SPELL_DEMONARMOR
#define GOSSIP_ITEM_TEACH_2
@ SPELL_CURSEOFWEAKNESS
@ SPELL_IMMOLATE
@ SPELL_DEMONARMOR
@ SPELL_SUMMON_VOIDWALKERS
@ SPELL_SHADOWBOLTVOLLEY
#define GOSSIP_ITEM_CHALLENGE
@ QUEST_SPECTRAL_CHALICE
@ DATA_SKILLPOINT_MIN
@ SPELL_SMELT_DARK_IRON
@ SPELL_LEARN_SMELT
void AddSC_boss_tomb_of_seven()
#define GOSSIP_ITEM_TEACH_3
#define GOSSIP_ITEM_TEACH_1
#define GOSSIP_ITEM_TRIBUTE
#define GOSSIP_SELECT_DOOMREL
bool UpdateVictim()
CreatureScript(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
virtual void SetData64(uint32, uint64)
Definition ZoneScript.h:33
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
Creature * me
bool HealthBelowPct(uint32 pct) const
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================