fix(Scripts/Ulduar): Fixed spawning Hodir chests. (#10844)

This commit is contained in:
UltraNix
2022-03-09 09:26:25 +01:00
committed by GitHub
parent 5e7166977e
commit 37d92f8dc8
3 changed files with 76 additions and 78 deletions

View File

@@ -257,11 +257,6 @@ public:
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
} }
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE)
{
pInstance->SetData(TYPE_SPAWN_HODIR_CACHE, 0);
}
// Reset helpers // Reset helpers
if (!summons.size()) if (!summons.size())
SpawnHelpers(); SpawnHelpers();
@@ -296,10 +291,13 @@ public:
switch (action) switch (action)
{ {
case EVENT_FAIL_HM: case EVENT_FAIL_HM:
if (GameObject* go = me->FindNearestGameObject(GO_HODIR_CHEST_HARD, 500.0f)) if (pInstance)
{ {
go->SetGoState(GO_STATE_ACTIVE); if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_HODIR_CHEST_HARD)))
events.ScheduleEvent(EVENT_DESPAWN_CHEST, 3000); {
go->SetGoState(GO_STATE_ACTIVE);
events.ScheduleEvent(EVENT_DESPAWN_CHEST, 3000);
}
} }
break; break;
} }
@@ -425,7 +423,13 @@ public:
case EVENT_HARD_MODE_MISSED: case EVENT_HARD_MODE_MISSED:
{ {
Talk(TEXT_HM_MISS); Talk(TEXT_HM_MISS);
me->CastSpell(me->FindNearestGameObject(GO_HODIR_CHEST_HARD, 400.0f), SPELL_SHATTER_CHEST, false); if (pInstance)
{
if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_HODIR_CHEST_HARD)))
{
me->CastSpell(go, SPELL_SHATTER_CHEST, false);
}
}
} }
break; break;
case EVENT_DESPAWN_CHEST: case EVENT_DESPAWN_CHEST:
@@ -1161,15 +1165,17 @@ public:
{ {
PrepareSpellScript(spell_hodir_shatter_chestSpellScript) PrepareSpellScript(spell_hodir_shatter_chestSpellScript)
void destroyWinterCache() void destroyWinterCache(SpellEffIndex effIndex)
{ {
PreventHitDefaultEffect(effIndex);
if (Unit* hodir = GetCaster()) if (Unit* hodir = GetCaster())
hodir->GetAI()->DoAction(EVENT_FAIL_HM); hodir->GetAI()->DoAction(EVENT_FAIL_HM);
} }
void Register() override void Register() override
{ {
AfterHit += SpellHitFn(spell_hodir_shatter_chestSpellScript::destroyWinterCache); OnEffectHit += SpellEffectFn(spell_hodir_shatter_chestSpellScript::destroyWinterCache, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE);
}; };
}; };

View File

@@ -214,75 +214,74 @@ public:
SetData(eventId, 0); SetData(eventId, 0);
} }
void SpawnHodirChests(int rd) void SpawnHodirChests(Difficulty diff, Creature* hodir)
{ {
if (Creature* cr = instance->GetCreature(m_uiHodirGUID)) switch (diff)
{ {
switch (rd) case RAID_DIFFICULTY_10MAN_NORMAL: // 10 man chest
{ {
case 0: // 10 man chest if (!m_hodirNormalChest)
{ {
if (!m_hodirNormalChest) if (GameObject* go = hodir->SummonGameObject(
GO_HODIR_CHEST_NORMAL,
normalChestPosition.GetPositionX(),
normalChestPosition.GetPositionY(),
normalChestPosition.GetPositionZ(),
normalChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{ {
if (GameObject* go = cr->SummonGameObject( m_hodirNormalChest = go->GetGUID();
GO_HODIR_CHEST_NORMAL, go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
normalChestPosition.GetPositionX(),
normalChestPosition.GetPositionY(),
normalChestPosition.GetPositionZ(),
normalChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirNormalChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
} }
if (!m_hodirHardmodeChest)
{
if (GameObject* go = cr->SummonGameObject(
GO_HODIR_CHEST_HARD,
hardChestPosition.GetPositionX(),
hardChestPosition.GetPositionY(),
hardChestPosition.GetPositionZ(),
hardChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirHardmodeChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
hmHodir = true;
}
}
break;
} }
case 1: // 25 man chest if (!m_hodirHardmodeChest)
{ {
if (!m_hodirNormalChest) if (GameObject* go = hodir->SummonGameObject(
GO_HODIR_CHEST_HARD,
hardChestPosition.GetPositionX(),
hardChestPosition.GetPositionY(),
hardChestPosition.GetPositionZ(),
hardChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{ {
if (GameObject* go = cr->SummonGameObject( m_hodirHardmodeChest = go->GetGUID();
GO_HODIR_CHEST_NORMAL_HERO, go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
normalChestPosition.GetPositionX(), hmHodir = true;
normalChestPosition.GetPositionY(),
normalChestPosition.GetPositionZ(),
normalChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirNormalChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
} }
if (!m_hodirHardmodeChest)
{
if (GameObject* go = cr->SummonGameObject(
GO_HODIR_CHEST_HARD_HERO,
hardChestPosition.GetPositionX(),
hardChestPosition.GetPositionY(),
hardChestPosition.GetPositionZ(),
hardChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirHardmodeChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
hmHodir = true;
}
}
break;
} }
break;
} }
case RAID_DIFFICULTY_25MAN_NORMAL: // 25 man chest
{
if (!m_hodirNormalChest)
{
if (GameObject* go = hodir->SummonGameObject(
GO_HODIR_CHEST_NORMAL_HERO,
normalChestPosition.GetPositionX(),
normalChestPosition.GetPositionY(),
normalChestPosition.GetPositionZ(),
normalChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirNormalChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
}
if (!m_hodirHardmodeChest)
{
if (GameObject* go = hodir->SummonGameObject(
GO_HODIR_CHEST_HARD_HERO,
hardChestPosition.GetPositionX(),
hardChestPosition.GetPositionY(),
hardChestPosition.GetPositionZ(),
hardChestPosition.GetOrientation(), 0, 0, 0, 0, 0))
{
m_hodirHardmodeChest = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
hmHodir = true;
}
}
break;
}
default:
break;
} }
} }
@@ -329,6 +328,7 @@ public:
break; break;
case NPC_HODIR: case NPC_HODIR:
m_uiHodirGUID = creature->GetGUID(); m_uiHodirGUID = creature->GetGUID();
SpawnHodirChests(instance->GetDifficulty(), creature);
break; break;
case NPC_THORIM: case NPC_THORIM:
m_uiThorimGUID = creature->GetGUID(); m_uiThorimGUID = creature->GetGUID();
@@ -690,11 +690,6 @@ public:
if (GetData(TYPE_HODIR) == DONE) if (GetData(TYPE_HODIR) == DONE)
setChestsLootable(TYPE_HODIR); setChestsLootable(TYPE_HODIR);
break; break;
case TYPE_SPAWN_HODIR_CACHE:
// Is the difficulty 10 man(0) ? return 10 man : return 25 man;
SpawnHodirChests(m_difficulty == 0 ? 0 : 1);
break;
case TYPE_HODIR_HM_FAIL: case TYPE_HODIR_HM_FAIL:
if (GameObject* go = instance->GetGameObject(m_hodirHardmodeChest)) if (GameObject* go = instance->GetGameObject(m_hodirHardmodeChest))
{ {
@@ -909,10 +904,8 @@ public:
// Hodir chests // Hodir chests
case GO_HODIR_CHEST_HARD: case GO_HODIR_CHEST_HARD:
case GO_HODIR_CHEST_HARD_HERO:
return m_hodirHardmodeChest; return m_hodirHardmodeChest;
case GO_HODIR_CHEST_NORMAL: case GO_HODIR_CHEST_NORMAL:
case GO_HODIR_CHEST_NORMAL_HERO:
return m_hodirNormalChest; return m_hodirNormalChest;
// Freya Elders // Freya Elders

View File

@@ -45,9 +45,8 @@ enum UlduarEncounters
TYPE_YOGGSARON = 12, TYPE_YOGGSARON = 12,
TYPE_ALGALON = 13, TYPE_ALGALON = 13,
TYPE_WATCHERS = 14, TYPE_WATCHERS = 14,
TYPE_SPAWN_HODIR_CACHE = 15, TYPE_HODIR_HM_FAIL = 15,
TYPE_HODIR_HM_FAIL = 16, TYPE_WINTER_CACHE = 16
TYPE_WINTER_CACHE = 17,
}; };
enum UlduarData enum UlduarData