Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_trial_of_the_crusader.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 "InstanceScript.h"
9#include "Player.h"
10#include "TemporarySummon.h"
11
13{
14 public:
15 instance_trial_of_the_crusader() : InstanceMapScript("instance_trial_of_the_crusader", 649) { }
16
18 {
20
58
60 {
61 for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
62 if (GetBossState(i) == IN_PROGRESS)
63 return true;
64
65 // Special state is set at Faction Champions after first champ dead, encounter is still in combat
67 return true;
68
69 return false;
70 }
71
73 {
74 if (instance->IsHeroic())
75 {
76 player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW, 1);
77 player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, GetData(TYPE_COUNTER));
78 }
79 else
80 player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW, 0);
81
82 // make sure Anub'arak isnt missing and floor is destroyed after a crash
84 {
85 Creature* anubArak = Unit::GetCreature(*player, GetData64(NPC_ANUBARAK));
86 if (!anubArak)
87 anubArak = player->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
88
90 floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
91 }
92 }
93
94 void OpenDoor(uint64 guid)
95 {
96 if (!guid)
97 return;
98
99 if (GameObject* go = instance->GetGameObject(guid))
101 }
102
103 void CloseDoor(uint64 guid)
104 {
105 if (!guid)
106 return;
107
108 if (GameObject* go = instance->GetGameObject(guid))
109 go->SetGoState(GOState::GO_STATE_READY);
110 }
111
113 {
114 switch (creature->GetEntry())
115 {
116 case NPC_BARRENT:
117 BarrentGUID = creature->GetGUID();
118 if (!TrialCounter)
119 creature->DespawnOrUnsummon();
120 break;
121 case NPC_TIRION:
122 TirionGUID = creature->GetGUID();
123 break;
125 TirionFordringGUID = creature->GetGUID();
126 break;
127 case NPC_FIZZLEBANG:
128 FizzlebangGUID = creature->GetGUID();
129 break;
130 case NPC_GARROSH:
131 GarroshGUID = creature->GetGUID();
132 break;
133 case NPC_VARIAN:
134 VarianGUID = creature->GetGUID();
135 break;
136
137 case NPC_GORMOK:
138 GormokGUID = creature->GetGUID();
139 break;
140 case NPC_ACIDMAW:
141 AcidmawGUID = creature->GetGUID();
142 break;
143 case NPC_DREADSCALE:
144 DreadscaleGUID = creature->GetGUID();
145 break;
146 case NPC_ICEHOWL:
147 IcehowlGUID = creature->GetGUID();
148 break;
149 case NPC_JARAXXUS:
150 JaraxxusGUID = creature->GetGUID();
151 break;
153 ChampionsControllerGUID = creature->GetGUID();
154 break;
155 case NPC_DARKBANE:
156 DarkbaneGUID = creature->GetGUID();
157 break;
158 case NPC_LIGHTBANE:
159 LightbaneGUID = creature->GetGUID();
160 break;
161 case NPC_ANUBARAK:
162 AnubarakGUID = creature->GetGUID();
163 break;
164 default:
165 break;
166 }
167 }
168
170 {
171 switch (go->GetEntry())
172 {
174 if (instance->GetSpawnMode() == DIFFICULTY_10MAN_NORMAL)
175 CrusadersCacheGUID = go->GetGUID();
176 break;
178 if (instance->GetSpawnMode() == DIFFICULTY_25MAN_NORMAL)
179 CrusadersCacheGUID = go->GetGUID();
180 break;
182 if (instance->GetSpawnMode() == DIFFICULTY_10MAN_HEROIC)
183 CrusadersCacheGUID = go->GetGUID();
184 break;
186 if (instance->GetSpawnMode() == DIFFICULTY_25MAN_HEROIC)
187 CrusadersCacheGUID = go->GetGUID();
188 break;
190 FloorGUID = go->GetGUID();
191 break;
193 MainGateDoorGUID = go->GetGUID();
194 break;
196 EastPortcullisGUID = go->GetGUID();
197 break;
198 case GO_WEB_DOOR:
199 WebDoorGUID = go->GetGUID();
200 break;
201
210 TributeChestGUID = go->GetGUID();
211 break;
212 default:
213 break;
214 }
215 }
216
218 {
219 if (!InstanceScript::SetBossState(type, state))
220 return false;
221
222 switch (type)
223 {
224 case BOSS_BEASTS:
225 break;
226 case BOSS_JARAXXUS:
227 // Cleanup Icehowl
228 if (Creature* icehowl = instance->GetCreature(IcehowlGUID))
229 icehowl->DespawnOrUnsummon();
230 if (state == DONE)
231 EventStage = 2000;
232 break;
233 case BOSS_CRUSADERS:
234 // Cleanup Jaraxxus
235 if (Creature* jaraxxus = instance->GetCreature(JaraxxusGUID))
236 jaraxxus->DespawnOrUnsummon();
237 if (Creature* fizzlebang = instance->GetCreature(FizzlebangGUID))
238 fizzlebang->DespawnOrUnsummon();
239 switch (state)
240 {
241 case IN_PROGRESS:
243 break;
244 case SPECIAL: //Means the first blood
246 state = IN_PROGRESS;
247 break;
248 case DONE:
253 if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
255 EventStage = 3100;
256 break;
257 default:
258 break;
259 }
260 break;
261 case BOSS_VALKIRIES:
262 // Cleanup chest
263 if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
264 cache->Delete();
265 switch (state)
266 {
267 case FAIL:
269 state = NOT_STARTED;
270 break;
271 case SPECIAL:
273 state = DONE;
274 break;
275 case DONE:
276 if (instance->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
277 EventStage = 4020;
278 else
279 EventStage = 4030;
280 break;
281 default:
282 break;
283 }
284 break;
285 case BOSS_LICH_KING:
286 break;
287 case BOSS_ANUBARAK:
288 switch (state)
289 {
290 case DONE:
291 {
292 EventStage = 6000;
293 uint32 tributeChest = 0;
294 if (instance->GetSpawnMode() == DIFFICULTY_10MAN_HEROIC)
295 {
296 if (TrialCounter >= 50)
297 tributeChest = GO_TRIBUTE_CHEST_10H_99;
298 else
299 {
300 if (TrialCounter >= 45)
301 tributeChest = GO_TRIBUTE_CHEST_10H_50;
302 else
303 {
304 if (TrialCounter >= 25)
305 tributeChest = GO_TRIBUTE_CHEST_10H_45;
306 else
307 tributeChest = GO_TRIBUTE_CHEST_10H_25;
308 }
309 }
310 }
311 else if (instance->GetSpawnMode() == DIFFICULTY_25MAN_HEROIC)
312 {
313 if (TrialCounter >= 50)
314 tributeChest = GO_TRIBUTE_CHEST_25H_99;
315 else
316 {
317 if (TrialCounter >= 45)
318 tributeChest = GO_TRIBUTE_CHEST_25H_50;
319 else
320 {
321 if (TrialCounter >= 25)
322 tributeChest = GO_TRIBUTE_CHEST_25H_45;
323 else
324 tributeChest = GO_TRIBUTE_CHEST_25H_25;
325 }
326 }
327 }
328
329 if (tributeChest)
330 if (Creature* tirion = instance->GetCreature(TirionGUID))
331 if (GameObject* chest = tirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, WEEK))
332 chest->SetRespawnTime(chest->GetRespawnDelay());
333 break;
334 }
335 default:
336 break;
337 }
338 break;
339 default:
340 break;
341 }
342
344 {
347 }
348 else
349 {
352 }
353
354 if (type < MAX_ENCOUNTERS)
355 {
356 SF_LOG_INFO("scripts", "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state);
357 if (state == FAIL)
358 {
359 if (instance->IsHeroic())
360 {
361 --TrialCounter;
362 // decrease attempt counter at wipe
363 Map::PlayerList const &PlayerList = instance->GetPlayers();
364 for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
365 if (Player* player = itr->GetSource())
366 player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, TrialCounter);
367
368 // if theres no more attemps allowed
369 if (!TrialCounter)
370 {
371 if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT)))
372 announcer->ToCreature()->DespawnOrUnsummon();
373
374 if (Creature* anubArak = instance->GetCreature(GetData64(NPC_ANUBARAK)))
375 anubArak->DespawnOrUnsummon();
376 }
377 }
378 NeedSave = true;
379 EventStage = (type == BOSS_BEASTS ? 666 : 0);
380 state = NOT_STARTED;
381 }
382
383 if (state == DONE || NeedSave)
384 {
385 if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT)))
386 announcer->SetFlag(UNIT_FIELD_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
387 Save();
388 }
389 }
390 return true;
391 }
392
393 void SetData(uint32 type, uint32 data) OVERRIDE
394 {
395 switch (type)
396 {
397 case TYPE_COUNTER:
398 TrialCounter = data;
399 data = DONE;
400 break;
401 case TYPE_EVENT:
402 EventStage = data;
403 data = NOT_STARTED;
404 break;
405 case TYPE_EVENT_TIMER:
406 EventTimer = data;
407 data = NOT_STARTED;
408 break;
410 NorthrendBeasts = data;
411 switch (data)
412 {
413 case GORMOK_DONE:
414 EventStage = 200;
416 break;
419 break;
420 case SNAKES_SPECIAL:
422 break;
423 case SNAKES_DONE:
426 EventStage = 300;
428 break;
429 case ICEHOWL_DONE:
430 EventStage = 400;
433 break;
434 case FAIL:
436 break;
437 default:
438 break;
439 }
440 break;
441 //Achievements
443 if (data == INCREASE)
444 ++SnoboldCount;
445 else if (data == DECREASE)
446 --SnoboldCount;
447 break;
449 if (data == INCREASE)
451 else if (data == DECREASE)
453 break;
456 break;
457 default:
458 break;
459 }
460 }
461
463 {
464 switch (type)
465 {
466 case NPC_BARRENT:
467 return BarrentGUID;
468 case NPC_TIRION:
469 return TirionGUID;
471 return TirionFordringGUID;
472 case NPC_FIZZLEBANG:
473 return FizzlebangGUID;
474 case NPC_GARROSH:
475 return GarroshGUID;
476 case NPC_VARIAN:
477 return VarianGUID;
478
479 case NPC_GORMOK:
480 return GormokGUID;
481 case NPC_ACIDMAW:
482 return AcidmawGUID;
483 case NPC_DREADSCALE:
484 return DreadscaleGUID;
485 case NPC_ICEHOWL:
486 return IcehowlGUID;
487 case NPC_JARAXXUS:
488 return JaraxxusGUID;
491 case NPC_DARKBANE:
492 return DarkbaneGUID;
493 case NPC_LIGHTBANE:
494 return LightbaneGUID;
495 case NPC_ANUBARAK:
496 return AnubarakGUID;
497
499 return FloorGUID;
501 return MainGateDoorGUID;
503 return EastPortcullisGUID;
504 case GO_WEB_DOOR:
505 return WebDoorGUID;
506 default:
507 break;
508 }
509
510 return 0;
511 }
512
514 {
515 switch (type)
516 {
517 case TYPE_COUNTER:
518 return TrialCounter;
519 case TYPE_EVENT:
520 return EventStage;
522 return NorthrendBeasts;
523 case TYPE_EVENT_TIMER:
524 return EventTimer;
525 case TYPE_EVENT_NPC:
526 switch (EventStage)
527 {
528 case 110:
529 case 140:
530 case 150:
531 case 155:
532 case 200:
533 case 205:
534 case 210:
535 case 220:
536 case 300:
537 case 305:
538 case 310:
539 case 315:
540 case 400:
541 case 666:
542 case 1010:
543 case 1180:
544 case 2000:
545 case 2030:
546 case 3000:
547 case 3001:
548 case 3060:
549 case 3061:
550 case 3090:
551 case 3091:
552 case 3092:
553 case 3100:
554 case 3110:
555 case 4000:
556 case 4010:
557 case 4015:
558 case 4016:
559 case 4040:
560 case 4050:
561 case 5000:
562 case 5005:
563 case 5020:
564 case 6000:
565 case 6005:
566 case 6010:
567 return NPC_TIRION;
568 break;
569 case 5010:
570 case 5030:
571 case 5040:
572 case 5050:
573 case 5060:
574 case 5070:
575 case 5080:
576 return NPC_LICH_KING_1;
577 break;
578 case 120:
579 case 122:
580 case 2020:
581 case 3080:
582 case 3051:
583 case 3071:
584 case 4020:
585 return NPC_VARIAN;
586 break;
587 case 130:
588 case 132:
589 case 2010:
590 case 3050:
591 case 3070:
592 case 3081:
593 case 4030:
594 return NPC_GARROSH;
595 break;
596 case 1110:
597 case 1120:
598 case 1130:
599 case 1132:
600 case 1134:
601 case 1135:
602 case 1140:
603 case 1142:
604 case 1144:
605 case 1150:
606 return NPC_FIZZLEBANG;
607 break;
608 default:
609 return NPC_TIRION;
610 break;
611 };
612 default:
613 break;
614 }
615
616 return 0;
617 }
618
637
638 void Save()
639 {
641
642 std::ostringstream saveStream;
643
644 for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
645 saveStream << GetBossState(i) << ' ';
646
647 saveStream << TrialCounter;
648 SaveDataBuffer = saveStream.str();
649
650 SaveToDB();
652 NeedSave = false;
653 }
654
655 std::string GetSaveData() OVERRIDE
656 {
657 return SaveDataBuffer;
658 }
659
660 void Load(const char* strIn) OVERRIDE
661 {
662 if (!strIn)
663 {
665 return;
666 }
667
668 OUT_LOAD_INST_DATA(strIn);
669
670 std::istringstream loadStream(strIn);
671
672 for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
673 {
674 uint32 tmpState;
675 loadStream >> tmpState;
676 if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
677 tmpState = NOT_STARTED;
678 SetBossState(i, EncounterState(tmpState));
679 }
680
681 loadStream >> TrialCounter;
682 EventStage = 0;
683
685 }
686
687 bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) OVERRIDE
688 {
689 switch (criteria_id)
690 {
693 return SnoboldCount >= 2;
696 return SnoboldCount >= 4;
701 return MistressOfPainCount >= 2;
704 return TrialCounter >= 25;
707 return TrialCounter >= 45;
711 return TrialCounter == 50;
716 return false/*uiGrandCrusaderAttemptsLeft == 50 && !bHasAtAnyStagePlayerEquippedTooGoodItem*/;
717 default:
718 break;
719 }
720
721 return false;
722 }
723
724 protected:
730 std::string SaveDataBuffer;
731
738
748
755
756 // Achievement stuff
762 };
763
768};
769
@ IN_MILLISECONDS
Definition Common.h:125
@ DAY
Definition Common.h:121
@ WEEK
Definition Common.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition DBCEnums.h:193
@ DIFFICULTY_10MAN_HEROIC
Definition DBCEnums.h:336
@ DIFFICULTY_25MAN_NORMAL
Definition DBCEnums.h:335
@ DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:334
@ DIFFICULTY_25MAN_HEROIC
Definition DBCEnums.h:337
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_STATE_READY
Definition GameObject.h:577
@ GO_STATE_ACTIVE_ALTERNATIVE
Definition GameObject.h:578
#define OUT_LOAD_INST_DATA_FAIL
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
#define OUT_SAVE_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA
#define OUT_LOAD_INST_DATA(a)
#define SF_LOG_INFO(filterType__,...)
Definition Log.h:137
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition Object.h:73
@ GO_DESTRUCTIBLE_DAMAGED
@ ALLIANCE
@ GO_FLAG_NOT_SELECTABLE
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ UNIT_FIELD_NPC_FLAGS
@ GAMEOBJECT_FIELD_FLAGS
@ NPC_ANUBARAK
Definition azjol_nerub.h:30
static GameObject * GetGameObject(WorldObject &object, uint64 guid)
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=NULL)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
EncounterState GetBossState(uint32 id) const
void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn=MINUTE)
Definition Map.h:238
MapRefManager PlayerList
Definition Map.h:406
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
Definition Unit.h:1367
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime)
Definition Object.cpp:2729
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition Object.cpp:2703
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
@ TYPE_EVENT
Definition gnomeregan.h:26
void AddSC_instance_trial_of_the_crusader()
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const *, Unit const *, uint32) OVERRIDE
@ UPDATE_STATE_UI_COUNT
@ UPDATE_STATE_UI_SHOW
@ 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
@ NPC_CHAMPIONS_CONTROLLER
@ NPC_LICH_KING_1
@ NPC_TIRION_FORDRING
@ SNAKES_IN_PROGRESS
const Position AnubarakLoc[]
@ THREE_SIXTY_PAIN_SPIKE_25_PLAYER
@ THREE_SIXTY_PAIN_SPIKE_10_PLAYER
@ A_TRIBUTE_TO_INSANITY_10_PLAYER
@ THREE_SIXTY_PAIN_SPIKE_25_PLAYER_HEROIC
@ A_TRIBUTE_TO_MAD_SKILL_10_PLAYER
@ SPELL_DEFEAT_FACTION_CHAMPIONS
@ A_TRIBUTE_TO_IMMORTALITY_ALLIANCE
@ SPELL_CHAMPIONS_KILLED_IN_MINUTE
@ UPPER_BACK_PAIN_25_PLAYER
@ A_TRIBUTE_TO_MAD_SKILL_25_PLAYER
@ A_TRIBUTE_TO_INSANITY_25_PLAYER
@ REALM_FIRST_GRAND_CRUSADER
@ THREE_SIXTY_PAIN_SPIKE_10_PLAYER_HEROIC
@ UPPER_BACK_PAIN_25_PLAYER_HEROIC
@ UPPER_BACK_PAIN_10_PLAYER
@ A_TRIBUTE_TO_SKILL_10_PLAYER
@ A_TRIBUTE_TO_DEDICATED_INSANITY
@ UPPER_BACK_PAIN_10_PLAYER_HEROIC
@ SPELL_WORMS_KILLED_IN_10_SECONDS
@ A_TRIBUTE_TO_IMMORTALITY_HORDE
@ A_TRIBUTE_TO_SKILL_25_PLAYER
@ BOSS_CRUSADERS
@ BOSS_LICH_KING
@ DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE
@ BOSS_VALKIRIES
@ TYPE_EVENT_NPC
@ DATA_MISTRESS_OF_PAIN_COUNT
@ MAX_ENCOUNTERS
@ TYPE_NORTHREND_BEASTS
@ BOSS_JARAXXUS
@ DATA_SNOBOLD_COUNT
@ BOSS_ANUBARAK
@ TYPE_EVENT_TIMER