Scripts/Ulduar: Initial implementation of the Thorim Encounter

Closes #7651

Fix logic fail in achievement:
SPELL_LIGHTNING_CHARGE aka 62279 is casted on Thorim itself to buff him, not the damage spell tracked by the achievement.
This commit is contained in:
joschiwald
2017-03-23 03:44:43 -03:00
committed by Aokromes
parent eae0f4d45e
commit 364dfc9c4c
5 changed files with 2082 additions and 36 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -53,6 +53,7 @@ static DoorData const doorData[] =
{ GO_MIMIRON_DOOR_1, BOSS_MIMIRON, DOOR_TYPE_ROOM },
{ GO_MIMIRON_DOOR_2, BOSS_MIMIRON, DOOR_TYPE_ROOM },
{ GO_MIMIRON_DOOR_3, BOSS_MIMIRON, DOOR_TYPE_ROOM },
{ GO_THORIM_ENCOUNTER_DOOR, BOSS_THORIM, DOOR_TYPE_ROOM },
{ GO_VEZAX_DOOR, BOSS_VEZAX, DOOR_TYPE_PASSAGE },
{ GO_YOGG_SARON_DOOR, BOSS_YOGG_SARON, DOOR_TYPE_ROOM },
{ GO_DOODAD_UL_SIGILDOOR_03, BOSS_ALGALON, DOOR_TYPE_ROOM },
@@ -89,6 +90,9 @@ ObjectData const creatureData[] =
{ NPC_EXPEDITION_COMMANDER, DATA_EXPEDITION_COMMANDER },
{ NPC_RAZORSCALE_CONTROLLER, DATA_RAZORSCALE_CONTROL },
{ NPC_SIF, DATA_SIF },
{ NPC_RUNIC_COLOSSUS, DATA_RUNIC_COLOSSUS },
{ NPC_RUNE_GIANT, DATA_RUNE_GIANT },
{ NPC_COMPUTER, DATA_COMPUTER },
{ NPC_WORLD_TRIGGER_MIMIRON, DATA_MIMIRON_WORLD_TRIGGER },
{ NPC_VOICE_OF_YOGG_SARON, DATA_VOICE_OF_YOGG_SARON },
@@ -112,6 +116,9 @@ ObjectData const objectData[] =
{ GO_RAZOR_HARPOON_2, GO_RAZOR_HARPOON_2 },
{ GO_RAZOR_HARPOON_3, GO_RAZOR_HARPOON_3 },
{ GO_RAZOR_HARPOON_4, GO_RAZOR_HARPOON_4 },
{ GO_THORIM_LEVER, DATA_THORIM_LEVER },
{ GO_THORIM_STONE_DOOR, DATA_STONE_DOOR },
{ GO_THORIM_RUNIC_DOOR, DATA_RUNIC_DOOR },
{ 0, 0 }
};
@@ -167,7 +174,8 @@ class instance_ulduar : public InstanceMapScript
ObjectGuid LeviathanGateGUID;
ObjectGuid KologarnChestGUID;
ObjectGuid KologarnBridgeGUID;
ObjectGuid ThorimChestGUID;
ObjectGuid CacheOfStormsGUID;
ObjectGuid CacheOfStormsHardmodeGUID;
ObjectGuid HodirRareCacheGUID;
ObjectGuid HodirChestGUID;
ObjectGuid MimironTramGUID;
@@ -439,9 +447,13 @@ class instance_ulduar : public InstanceMapScript
if (GetBossState(BOSS_KOLOGARN) == DONE)
HandleGameObject(ObjectGuid::Empty, false, gameObject);
break;
case GO_THORIM_CHEST_HERO:
case GO_THORIM_CHEST:
ThorimChestGUID = gameObject->GetGUID();
case GO_CACHE_OF_STORMS_10:
case GO_CACHE_OF_STORMS_25:
CacheOfStormsGUID = gameObject->GetGUID();
break;
case GO_CACHE_OF_STORMS_HARDMODE_10:
case GO_CACHE_OF_STORMS_HARDMODE_25:
CacheOfStormsHardmodeGUID = gameObject->GetGUID();
break;
case GO_HODIR_RARE_CACHE_OF_WINTER_HERO:
case GO_HODIR_RARE_CACHE_OF_WINTER:
@@ -648,9 +660,15 @@ class instance_ulduar : public InstanceMapScript
case BOSS_THORIM:
if (state == DONE)
{
if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID))
gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
if (Creature* thorim = GetCreature(BOSS_THORIM))
{
if (GameObject* cache = instance->GetGameObject(thorim->AI()->GetData(DATA_THORIM_HARDMODE) ? CacheOfStormsHardmodeGUID : CacheOfStormsGUID))
{
cache->SetLootRecipient(thorim->GetLootRecipient());
cache->SetRespawnTime(cache->GetRespawnDelay());
cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
}
}
instance->SummonCreature(NPC_THORIM_OBSERVATION_RING, ObservationRingKeepersPos[2]);
}
break;

View File

@@ -153,6 +153,24 @@ enum UlduarNPCs
// Freya Achievement Trigger
NPC_FREYA_ACHIEVE_TRIGGER = 33406,
// Thorim
NPC_THORIM_INVISIBLE_STALKER = 32780,
NPC_RUNIC_COLOSSUS = 32872,
NPC_RUNE_GIANT = 32873,
NPC_IRON_RING_GUARD = 32874,
NPC_IRON_HONOR_GUARD = 32875,
NPC_DARK_RUNE_CHAMPION = 32876,
NPC_DARK_RUNE_WARBRINGER = 32877,
NPC_DARK_RUNE_EVOKER = 32878,
NPC_DARK_RUNE_COMMONER = 32904,
NPC_DARK_RUNE_ACOLYTE = 33110,
NPC_THORIM_EVENT_BUNNY = 32892,
NPC_LIGHTNING_ORB = 33138,
NPC_GOLEM_RIGHT_HAND_BUNNY = 33140,
NPC_GOLEM_LEFT_HAND_BUNNY = 33141,
NPC_SIF = 33196,
NPC_THUNDER_ORB = 33378,
// Yogg-Saron
NPC_SARA = 33134,
NPC_GUARDIAN_OF_YOGG_SARON = 33136,
@@ -237,8 +255,14 @@ enum UlduarGameObjects
GO_HODIR_CHEST = 194307,
// Thorim
GO_THORIM_CHEST_HERO = 194315,
GO_THORIM_CHEST = 194314,
GO_CACHE_OF_STORMS_10 = 194312,
GO_CACHE_OF_STORMS_HARDMODE_10 = 194313,
GO_CACHE_OF_STORMS_25 = 194315,
GO_CACHE_OF_STORMS_HARDMODE_25 = 194314,
GO_THORIM_RUNIC_DOOR = 194557,
GO_THORIM_STONE_DOOR = 194558,
GO_THORIM_ENCOUNTER_DOOR = 194559,
GO_THORIM_LEVER = 194265,
// Mimiron
GO_MIMIRON_TRAM = 194675,
@@ -404,6 +428,15 @@ enum UlduarData
DATA_ALGALON_TRAPDOOR,
DATA_BRANN_BRONZEBEARD_ALG,
// Thorim
DATA_SIF,
DATA_THORIM_LEVER,
DATA_RUNIC_COLOSSUS,
DATA_RUNE_GIANT,
DATA_RUNIC_DOOR,
DATA_STONE_DOOR,
DATA_THORIM_HARDMODE,
// Misc
DATA_BRANN_BRONZEBEARD_INTRO,
DATA_LORE_KEEPER_OF_NORGANNON,
@@ -420,10 +453,15 @@ enum UlduarWorldStates
enum UlduarAchievementData
{
// FL Achievement boolean
DATA_UNBROKEN = 29052906, // 2905, 2906 are achievement IDs,
DATA_UNBROKEN = 29052906, // 2905, 2906 are achievement IDs,
MAX_HERALD_ARMOR_ITEMLEVEL = 226,
MAX_HERALD_WEAPON_ITEMLEVEL = 232,
SPELL_LUMBERJACKED_CREDIT = 65296
MAX_HERALD_WEAPON_ITEMLEVEL = 232
};
enum UlduarSharedSpells
{
SPELL_LUMBERJACKED_CREDIT = 65296,
SPELL_TELEPORT_KEEPER_VISUAL = 62940 // used by keepers
};
enum UlduarEvents
@@ -448,6 +486,23 @@ AI* GetUlduarAI(T* obj)
return GetInstanceAI<AI, T>(obj, UlduarScriptName);
}
class KeeperDespawnEvent : public BasicEvent
{
public:
KeeperDespawnEvent(Creature* owner, uint32 despawnTimerOffset = 500) : _owner(owner), _despawnTimer(despawnTimerOffset) { }
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override
{
_owner->CastSpell(_owner, SPELL_TELEPORT_KEEPER_VISUAL);
_owner->DespawnOrUnsummon(1000 + _despawnTimer);
return true;
}
private:
Creature* _owner;
uint32 _despawnTimer;
};
class PlayerOrPetCheck
{
public:

View File

@@ -110,6 +110,7 @@ void AddSC_boss_general_vezax();
void AddSC_boss_mimiron();
void AddSC_boss_hodir();
void AddSC_boss_freya();
void AddSC_boss_thorim();
void AddSC_boss_yogg_saron();
void AddSC_boss_algalon_the_observer();
void AddSC_instance_ulduar();
@@ -291,6 +292,7 @@ void AddNorthrendScripts()
AddSC_boss_mimiron();
AddSC_boss_hodir();
AddSC_boss_freya();
AddSC_boss_thorim();
AddSC_boss_yogg_saron();
AddSC_boss_algalon_the_observer();
AddSC_instance_ulduar();