TrinityCore
instance_trial_of_the_crusader.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#include "ScriptMgr.h"
19#include "AreaBoundary.h"
20#include "GameObject.h"
21#include "InstanceScript.h"
22#include "Log.h"
23#include "Map.h"
24#include "Player.h"
25#include "ScriptedCreature.h"
26#include "TemporarySummon.h"
28
29 // ToDo: Remove magic numbers of events
30
32{
33 { DATA_NORTHREND_BEASTS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
34 { DATA_JARAXXUS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
35 { DATA_FACTION_CRUSADERS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
36 { DATA_TWIN_VALKIRIES, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
37 { DATA_ANUBARAK, new EllipseBoundary(Position(746.0f, 135.0f), 100.0, 75.0) }
38};
39
41{
60 { 0, 0 } // END
61};
62
64{
81 { 0, 0 } // END
82};
83
85{
93};
94
96{
97 { DATA_NORTHREND_BEASTS, {{ 1088 }} },
98 { DATA_JARAXXUS, {{ 1087 }} },
99 { DATA_FACTION_CRUSADERS, {{ 1086 }} },
100 { DATA_TWIN_VALKIRIES, {{ 1089 }} },
101 { DATA_ANUBARAK, {{ 1085 }} }
102};
103
105{
106 public:
108
110 {
112 {
119 EventStage = 0;
123 EventTimer = 1000;
126 SnoboldCount = 0;
129 CrusadersSpecialState = false;
130 TributeToDedicatedInsanity = false; // NYI, set to true when implement it
132 }
133
134 void OnPlayerEnter(Player* player) override
135 {
136 if (Team == TEAM_OTHER)
137 Team = player->GetTeam();
138
141 }
142
143 void OnCreatureCreate(Creature* creature) override
144 {
146 if (creature->GetEntry() == NPC_SNOBOLD_VASSAL)
147 snoboldGUIDS.push_back(creature->GetGUID());
148 }
149
151 {
156 }
157
158 void OnUnitDeath(Unit* unit) override
159 {
161 {
164 }
165 }
166
167 bool SetBossState(uint32 type, EncounterState state) override
168 {
169 if (!InstanceScript::SetBossState(type, state))
170 return false;
171
172 switch (type)
173 {
175 break;
176 case DATA_JARAXXUS:
177 if (state == FAIL)
178 {
179 if (Creature* fordring = GetCreature(DATA_FORDRING))
180 fordring->AI()->DoAction(ACTION_JARAXXUS_WIPE);
182 }
183 else if (state == DONE)
184 {
185 if (Creature* fordring = GetCreature(DATA_FORDRING))
186 fordring->AI()->DoAction(ACTION_JARAXXUS_DEFEATED);
187 EventStage = 2000;
188 }
189 break;
191 switch (state)
192 {
193 case IN_PROGRESS:
195 break;
196 case FAIL:
197 CrusadersSpecialState = false;
198 if (Creature* fordring = GetCreature(DATA_FORDRING))
199 fordring->AI()->DoAction(ACTION_FACTION_WIPE);
200 break;
201 case DONE:
207 cache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
208 if (Creature* fordring = GetCreature(DATA_FORDRING))
209 fordring->AI()->DoAction(ACTION_CHAMPIONS_DEFEATED);
210 EventStage = 3100;
211 break;
212 default:
213 break;
214 }
215 break;
217 // Cleanup chest
219 cache->Delete();
220 switch (state)
221 {
222 case FAIL:
223 if (Creature* fordring = GetCreature(DATA_FORDRING))
224 fordring->AI()->DoAction(ACTION_VALKYR_WIPE);
225 break;
226 case DONE:
227 if (Creature* fordring = GetCreature(DATA_FORDRING))
228 fordring->AI()->DoAction(ACTION_VALKYR_DEFEATED);
229 break;
230 default:
231 break;
232 }
233 break;
234 case DATA_LICH_KING:
235 break;
236 case DATA_ANUBARAK:
237 switch (state)
238 {
239 case DONE:
240 {
241 EventStage = 6000;
242 break;
243 }
244 default:
245 break;
246 }
247 break;
248 default:
249 break;
250 }
251
252 if (type < EncounterCount)
253 {
254 TC_LOG_DEBUG("scripts", "[ToCr] BossState(type {}) {} = state {};", type, GetBossState(type), state);
255 if (state == FAIL)
256 {
257 EventStage = (type == DATA_NORTHREND_BEASTS ? 666 : 0);
258 state = NOT_STARTED;
259 }
260 }
261 return true;
262 }
263
265 {
268 {
272 EventStage = 400;
273 if (Creature* combatStalker = GetCreature(DATA_BEASTS_COMBAT_STALKER))
274 combatStalker->DespawnOrUnsummon();
275 HandlePlayerVehicle(false);
276 if (Creature* fordring = GetCreature(DATA_FORDRING))
277 fordring->AI()->DoAction(ACTION_NORTHREND_BEASTS_DEFEATED);
278 }
279 }
280
282 {
283 Map::PlayerList const &players = instance->GetPlayers();
284 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
285 if (Player* player = itr->GetSource())
286 {
287 if (apply)
288 player->CreateVehicleKit(PLAYER_VEHICLE_ID, 0);
289 else
290 player->RemoveVehicleKit();
291 }
292 }
293
294 void SetData(uint32 type, uint32 data) override
295 {
296 switch (type)
297 {
298 case TYPE_EVENT:
299 EventStage = data;
300 data = NOT_STARTED;
301 break;
302 case TYPE_EVENT_TIMER:
303 EventTimer = data;
304 data = NOT_STARTED;
305 break;
307 NorthrendBeasts = data;
308 switch (data)
309 {
314 break;
315 case GORMOK_DONE:
316 if (Creature* tirion = GetCreature(DATA_FORDRING))
317 tirion->AI()->DoAction(ACTION_START_JORMUNGARS);
319 break;
322 break;
323 case SNAKES_SPECIAL:
326 break;
327 case SNAKES_DONE:
330 if (Creature* tirion = GetCreature(DATA_FORDRING))
331 tirion->AI()->DoAction(ACTION_START_ICEHOWL);
333 break;
334 case ICEHOWL_DONE:
336 break;
337 case FAIL:
338 HandlePlayerVehicle(false);
340 if (Creature* tirion = GetCreature(DATA_FORDRING))
341 tirion->AI()->DoAction(ACTION_NORTHREND_BEASTS_WIPE);
342 SnoboldCount = 0;
343 break;
344 default:
345 break;
346 }
347 break;
349 for (ObjectGuid guid : snoboldGUIDS)
350 if (Creature* snobold = instance->GetCreature(guid))
351 snobold->DespawnOrUnsummon();
352 snoboldGUIDS.clear();
353 break;
354 //Achievements
356 if (data == INCREASE)
357 ++SnoboldCount;
358 else if (data == DECREASE)
359 --SnoboldCount;
360 break;
362 if (data == INCREASE)
364 else if (data == DECREASE)
366 break;
367 case DATA_FACTION_CRUSADERS: // Achivement Resilience will Fix
370 break;
371 default:
372 break;
373 }
374 }
375
376 uint32 GetData(uint32 type) const override
377 {
378 switch (type)
379 {
380 case TYPE_EVENT:
381 return EventStage;
383 return NorthrendBeasts;
384 case TYPE_EVENT_TIMER:
385 return EventTimer;
386 case TYPE_EVENT_NPC:
387 switch (EventStage)
388 {
389 case 110:
390 case 140:
391 case 150:
392 case 155:
393 case 200:
394 case 205:
395 case 210:
396 case 220:
397 case 300:
398 case 305:
399 case 310:
400 case 315:
401 case 400:
402 case 666:
403 case 1010:
404 case 1180:
405 case 2000:
406 case 2030:
407 case 3000:
408 case 3001:
409 case 3060:
410 case 3061:
411 case 3090:
412 case 3091:
413 case 3092:
414 case 3100:
415 case 3110:
416 case 4000:
417 case 4010:
418 case 4015:
419 case 4016:
420 case 4040:
421 case 4050:
422 case 5000:
423 case 5005:
424 case 5020:
425 case 6000:
426 case 6005:
427 case 6010:
428 return NPC_TIRION_FORDRING;
429 break;
430 case 5010:
431 case 5030:
432 case 5040:
433 case 5050:
434 case 5060:
435 case 5070:
436 case 5080:
437 return NPC_LICH_KING;
438 break;
439 case 120:
440 case 122:
441 case 2020:
442 case 3080:
443 case 3051:
444 case 3071:
445 case 4020:
446 return NPC_VARIAN;
447 break;
448 case 130:
449 case 132:
450 case 2010:
451 case 3050:
452 case 3070:
453 case 3081:
454 case 4030:
455 return NPC_GARROSH;
456 break;
457 case 1110:
458 case 1120:
459 case 1130:
460 case 1132:
461 case 1134:
462 case 1135:
463 case 1140:
464 case 1142:
465 case 1144:
466 case 1150:
467 return NPC_FIZZLEBANG;
468 break;
469 default:
470 return NPC_TIRION_FORDRING;
471 break;
472 };
473 default:
474 break;
475 }
476
477 return 0;
478 }
479
480 void Update(uint32 diff) override
481 {
483 {
484 if (NotOneButTwoJormungarsTimer <= diff)
486 else
488 }
489
491 {
492 if (ResilienceWillFixItTimer <= diff)
494 else
496 }
497 }
498
499 bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override
500 {
501 switch (criteria_id)
502 {
505 return SnoboldCount >= 2;
508 return SnoboldCount >= 4;
513 return MistressOfPainCount >= 2;
515 return false; // no longer obtainable
516 default:
517 break;
518 }
519
520 return false;
521 }
522
523 protected:
530
531 // Achievement stuff
539 };
540
542 {
544 }
545};
546
548{
550}
@ IN_MILLISECONDS
Definition: Common.h:35
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
std::vector< ObjectGuid > GuidVector
Definition: ObjectGuid.h:395
@ GO_DESTRUCTIBLE_DAMAGED
Team
@ TEAM_OTHER
@ GO_FLAG_NOT_SELECTABLE
#define DataHeader
uint32 const EncounterCount
@ DATA_ANUBARAK
Definition: azjol_nerub.h:33
@ NPC_ANUBARAK
Definition: azjol_nerub.h:48
void SetDestructibleState(GameObjectDestructibleState state, WorldObject *attackerOrHealer=nullptr, bool setHealth=false)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
virtual void OnCreatureCreate(Creature *creature) override
Creature * GetCreature(uint32 type)
void LoadDungeonEncounterData(T const &encounters)
void DoUpdateWorldState(int32 worldStateId, int32 value)
virtual ObjectGuid GetGuidData(uint32 type) const override
InstanceMap * instance
void DoUpdateCriteria(CriteriaType type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
EncounterState GetBossState(uint32 id) const
void DoRespawnGameObject(ObjectGuid guid, Seconds timeToDespawn=1min)
virtual void OnGameObjectCreate(GameObject *go) override
virtual bool IsEncounterInProgress() const
void LoadDoorData(DoorData const *data)
GameObject * GetGameObject(uint32 type)
void LoadBossBoundaries(BossBoundaryData const &data)
void SetHeaders(std::string const &dataHeaders)
void LoadObjectData(ObjectData const *creatureData, ObjectData const *gameObjectData)
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
bool IsHeroic() const
Definition: Map.cpp:3282
PlayerList const & GetPlayers() const
Definition: Map.h:367
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Team GetTeam() const
Definition: Player.h:2235
Definition: Unit.h:627
bool CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading=false)
Definition: Unit.cpp:11443
InstanceScript * GetInstanceScript(InstanceMap *map) const override
ObjectData const gameObjectData[]
ObjectData const creatureData[]
DoorData const doorData[]
BossBoundaryData const boundaries
DungeonEncounterData const encounters[]
void AddSC_instance_trial_of_the_crusader()
void apply(T *val)
Definition: ByteConverter.h:41
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const *, Unit const *, uint32) override
@ DATA_MAIN_GATE
@ NPC_CHAMPIONS_CONTROLLER
@ NPC_SNOBOLD_VASSAL
@ NPC_DREADSCALE
@ NPC_FJOLA_LIGHTBANE
@ NPC_BEASTS_COMBAT_STALKER
@ NPC_EYDIS_DARKBANE
@ NPC_JARAXXUS
@ NPC_TIRION_FORDRING_ANUBARAK
@ NPC_FURIOUS_CHARGE_STALKER
@ NPC_LICH_KING
@ NPC_TIRION_FORDRING
@ NPC_FIZZLEBANG
@ NPC_LICH_KING_VOICE
@ ACTION_START_JORMUNGARS
@ ACTION_FACTION_WIPE
@ ACTION_JARAXXUS_WIPE
@ ACTION_NORTHREND_BEASTS_DEFEATED
@ ACTION_NORTHREND_BEASTS_WIPE
@ ACTION_JARAXXUS_DEFEATED
@ ACTION_CHAMPIONS_DEFEATED
@ ACTION_START_ICEHOWL
@ ACTION_VALKYR_DEFEATED
@ ACTION_VALKYR_WIPE
@ PLAYER_VEHICLE_ID
@ THREE_SIXTY_PAIN_SPIKE_25_PLAYER
@ THREE_SIXTY_PAIN_SPIKE_10_PLAYER
@ THREE_SIXTY_PAIN_SPIKE_25_PLAYER_HEROIC
@ SPELL_DEFEAT_FACTION_CHAMPIONS
@ SPELL_CHAMPIONS_KILLED_IN_MINUTE
@ UPPER_BACK_PAIN_25_PLAYER
@ THREE_SIXTY_PAIN_SPIKE_10_PLAYER_HEROIC
@ UPPER_BACK_PAIN_25_PLAYER_HEROIC
@ UPPER_BACK_PAIN_10_PLAYER
@ A_TRIBUTE_TO_DEDICATED_INSANITY
@ UPPER_BACK_PAIN_10_PLAYER_HEROIC
@ SPELL_WORMS_KILLED_IN_10_SECONDS
@ TYPE_EVENT
@ DATA_EAST_PORTCULLIS
@ DATA_TWIN_VALKIRIES
@ DATA_WEB_DOOR
@ DATA_TRIBUTE_CHEST
@ DATA_DESPAWN_SNOBOLDS
@ DATA_DREADSCALE
@ DATA_COLISEUM_FLOOR
@ DATA_GORMOK_THE_IMPALER
@ DATA_FORDRING_ANUBARAK
@ TYPE_EVENT_NPC
@ DATA_JARAXXUS
@ DATA_NORTHREND_BEASTS
@ DATA_MISTRESS_OF_PAIN_COUNT
@ DATA_ACIDMAW
@ DATA_LICH_KING
@ DATA_VARIAN
@ DATA_ICEHOWL
@ DATA_FACTION_CRUSADERS
@ DATA_FORDRING
@ TYPE_NORTHREND_BEASTS
@ DATA_SNOBOLD_COUNT
@ DATA_LICH_KING_VOICE
@ DATA_GARROSH
@ DATA_CRUSADERS_CHEST
@ DATA_EYDIS_DARKBANE
@ TYPE_EVENT_TIMER
@ DATA_FIZZLEBANG
@ DATA_FJOLA_LIGHTBANE
@ DATA_BEASTS_COMBAT_STALKER
@ DATA_FURIOUS_CHARGE
@ GORMOK_IN_PROGRESS
@ SNAKES_SPECIAL
@ SNAKES_IN_PROGRESS
@ ICEHOWL_DONE
@ UPDATE_STATE_UI_SHOW
@ WORLD_STATE_PLAYER_DEATHS
@ GO_TRIBUTE_CHEST_10H_99
@ GO_TRIBUTE_CHEST_25H_25
@ GO_TRIBUTE_CHEST_25H_99
@ GO_TRIBUTE_CHEST_25H_45
@ GO_CRUSADERS_CACHE_10_H
@ GO_TRIBUTE_CHEST_10H_45
@ GO_TRIBUTE_CHEST_25H_50
@ GO_CRUSADERS_CACHE_10
@ GO_CRUSADERS_CACHE_25_H
@ GO_TRIBUTE_CHEST_10H_25
@ GO_EAST_PORTCULLIS
@ GO_CRUSADERS_CACHE_25
@ GO_ARGENT_COLISEUM_FLOOR
@ GO_MAIN_GATE_DOOR
@ GO_TRIBUTE_CHEST_10H_50
#define ToCrScriptName