mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-09 08:17:56 +00:00
fix(Scripts/Ulduar): Fixed spawning Hodir chests. (#10844)
This commit is contained in:
@@ -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);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user