Scripts/Ulduar: Rewrite Hodir (#31682)

(cherry picked from commit 24dcc1f200fa84c44a73a9b474ce8884a2d66301)
This commit is contained in:
offl
2026-06-30 16:14:33 +02:00
committed by Shauren
parent 897d969e9a
commit bf02f5f812
4 changed files with 1155 additions and 935 deletions
@@ -0,0 +1,102 @@
-- Snowpacked Icicle Target
UPDATE `creature_template` SET `ScriptName` = 'npc_snowpacked_icicle_target' WHERE `entry` = 33174;
-- Messed up friends
UPDATE `creature_template` SET `ScriptName` = 'npc_hodir_druid' WHERE `entry` = 32901;
UPDATE `creature_template` SET `ScriptName` = 'npc_hodir_shaman' WHERE `entry` = 32900;
-- Priest
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 62809;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,1,62809,0,0,31,0,3,32893,0,0,0,0,"","Group 0: Spell 'Great Heal' (Effect 0) targets creature 'Missy Flamecuffs'"),
(13,1,62809,0,1,31,0,3,32897,0,0,0,0,"","Group 1: Spell 'Great Heal' (Effect 0) targets creature 'Field Medic Penny'"),
(13,1,62809,0,2,31,0,3,32900,0,0,0,0,"","Group 2: Spell 'Great Heal' (Effect 0) targets creature 'Elementalist Avuun'"),
(13,1,62809,0,3,31,0,3,32901,0,0,0,0,"","Group 3: Spell 'Great Heal' (Effect 0) targets creature 'Ellie Nightfeather'"),
(13,1,62809,0,4,31,0,3,32941,0,0,0,0,"","Group 4: Spell 'Great Heal' (Effect 0) targets creature 'Tor Greycloud'"),
(13,1,62809,0,5,31,0,3,32946,0,0,0,0,"","Group 5: Spell 'Great Heal' (Effect 0) targets creature 'Veesha Blazeweaver'"),
(13,1,62809,0,6,31,0,3,32948,0,0,0,0,"","Group 6: Spell 'Great Heal' (Effect 0) targets creature 'Battle-Priest Eliza'"),
(13,1,62809,0,7,31,0,3,32950,0,0,0,0,"","Group 7: Spell 'Great Heal' (Effect 0) targets creature 'Spiritwalker Yona'"),
(13,1,62809,0,8,31,0,3,33325,0,0,0,0,"","Group 8: Spell 'Great Heal' (Effect 0) targets creature 'Eivi Nightfeather'"),
(13,1,62809,0,9,31,0,3,33326,0,0,0,0,"","Group 10: Spell 'Great Heal' (Effect 0) targets creature 'Field Medic Jessi'"),
(13,1,62809,0,10,31,0,3,33327,0,0,0,0,"","Group 11: Spell 'Great Heal' (Effect 0) targets creature 'Sissy Flamecuffs'"),
(13,1,62809,0,11,31,0,3,33328,0,0,0,0,"","Group 12: Spell 'Great Heal' (Effect 0) targets creature 'Elementalist Mahfuun'"),
(13,1,62809,0,12,31,0,3,33330,0,0,0,0,"","Group 13: Spell 'Great Heal' (Effect 0) targets creature 'Battle-Priest Gina'"),
(13,1,62809,0,13,31,0,3,33331,0,0,0,0,"","Group 14: Spell 'Great Heal' (Effect 0) targets creature 'Amira Blazeweaver'"),
(13,1,62809,0,14,31,0,3,33332,0,0,0,0,"","Group 15: Spell 'Great Heal' (Effect 0) targets creature 'Spiritwalker Tara'"),
(13,1,62809,0,15,31,0,3,33333,0,0,0,0,"","Group 16: Spell 'Great Heal' (Effect 0) targets creature 'Kar Greycloud'");
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hodir_dispel_magic';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(63499, 'spell_hodir_dispel_magic');
-- Shaman
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hodir_storm_cloud_primer';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(62797, 'spell_hodir_storm_cloud_primer');
-- Mage
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 64543;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,1,64543,0,0,31,0,3,32926,0,0,0,0,"","Group 0: Spell 'Melt Ice' (Effect 0) targets creature 'Flash Freeze'"),
(13,1,64543,0,1,31,0,3,32938,0,0,0,0,"","Group 1: Spell 'Melt Ice' (Effect 0) targets creature 'Flash Freeze'");
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hodir_melt_ice';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(64543, 'spell_hodir_melt_ice');
-- Toasty Fire
UPDATE `creature_template` SET `unit_flags` = 33554432, `flags_extra` = `flags_extra` &~ 2 WHERE `entry` = 33342;
-- Flash Freeze (Init)
UPDATE `creature_template` SET `ScriptName` = 'npc_flash_freeze_init' WHERE `entry` = 32938;
-- Flash Freeze (Combat)
UPDATE `creature_template` SET `flags_extra` = `flags_extra` &~ (128|8192) WHERE `entry` IN (32926,33352);
UPDATE `creature_template` SET `ScriptName` = 'npc_flash_freeze_combat' WHERE `entry` = 32926;
-- Coolest Friends
UPDATE `creature_template` SET `unit_flags` = `unit_flags` |32768|512, `StringId` = 'HodirCoolestFriend' WHERE `entry` IN (32893,32897,32900,32901,32941,32946,32948,32950,33325,33326,33327,33328,33330,33331,33332,33333);
-- Hodir
DELETE FROM `creature_text` WHERE `CreatureID` = 32845 AND `GroupID` = 3;
UPDATE `creature_text` SET `Sound` = 15556 WHERE `CreatureID` = 32845 AND `GroupID` = 8;
UPDATE `spell_script_names` SET `ScriptName` = 'spell_hodir_biting_cold_area_aura' WHERE `ScriptName` = 'spell_biting_cold';
UPDATE `spell_script_names` SET `ScriptName` = 'spell_hodir_biting_cold_periodic' WHERE `ScriptName` = 'spell_biting_cold_dot';
DELETE FROM `spell_target_position` WHERE `ID` = 62501;
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
(62501,0,603,2036.17,-201.843,432.687,3.14159,0);
UPDATE `gameobject_template_addon` SET `flags` = 16 WHERE `entry` IN (194201,194307,194308);
UPDATE `gameobject` SET `spawntimesecs` = 604800 WHERE `id` IN (194307,194308);
DELETE FROM `gameobject` WHERE `guid` IN (9908,9911) AND `id` IN (194200,194201);
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `phaseId`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(9908,194200,603,0,0,'14,33',0,2036.169921875,-201.842605590820312,432.686798095703125,3.141592741012573242,0,0,-1,0,604800,255,1,'',NULL,0);
-- (9911,194201,603,0,0,2,1,2036.169921875,-201.842605590820312,432.686798095703125,3.141592741012573242,0,0,-1,0,604800,255,1,'',NULL,0);
DELETE FROM `spell_script_names` WHERE `ScriptName` IN (
'spell_hodir_shatter_chest',
'spell_hodir_icicle',
'spell_hodir_icicle_force_cast',
'spell_hodir_flash_freeze',
'spell_hodir_freeze');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(65272, 'spell_hodir_shatter_chest'),
(63545, 'spell_hodir_icicle'),
(62476, 'spell_hodir_icicle_force_cast'),
(62477, 'spell_hodir_icicle_force_cast'),
(61968, 'spell_hodir_flash_freeze'),
(62469, 'spell_hodir_freeze');
-- First is replaced by spell scripts, last 2 are simply removed since are based on nothing \ or simply wrong
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (62821,61969,61990);
--
UPDATE `serverside_spell` SET `DurationIndex` = 327 WHERE `Id` = 64899;
UPDATE `serverside_spell_effect` SET `ImplicitTarget1` = 22 /*18*/, `ImplicitTarget2` = 15 /*16*/ WHERE `SpellID` = 64899 AND `EffectIndex` = 0;
DELETE FROM `serverside_spell_effect` WHERE `SpellID` = 64899 AND `EffectIndex` = 1;
INSERT INTO `serverside_spell_effect` (`SpellID`, `EffectIndex`, `Effect`, `EffectAura`, `EffectRadiusIndex1`, `ImplicitTarget1`, `ImplicitTarget2`) VALUES
(64899, 1, 6, 4, 28, 22, 15);
File diff suppressed because it is too large Load Diff
@@ -187,7 +187,6 @@ class instance_ulduar : public InstanceMapScript
_maxArmorItemLevel = 0;
_maxWeaponItemLevel = 0;
HodirRareCacheData = 0;
ColossusData = 0;
elderCount = 0;
illusion = 0;
@@ -202,6 +201,8 @@ class instance_ulduar : public InstanceMapScript
memset(_summonObservationRingKeeper, 0, sizeof(_summonObservationRingKeeper));
memset(_summonYSKeeper, 0, sizeof(_summonYSKeeper));
DoUpdateWorldState(WORLD_STATE_ULDUAR_TEAM_IN_INSTANCE, map->GetTeamIdInInstance() == TEAM_HORDE ? 2 : 1);
}
// Creatures
@@ -229,7 +230,6 @@ class instance_ulduar : public InstanceMapScript
ObjectGuid BrainRoomDoorGUIDs[3];
// Miscellaneous
uint32 HodirRareCacheData;
uint32 ColossusData;
uint8 elderCount;
uint8 illusion;
@@ -406,22 +406,6 @@ class instance_ulduar : public InstanceMapScript
uint32 entry = data->id;
switch (entry)
{
case NPC_EIVI_NIGHTFEATHER:
return instance->GetTeamInInstance() == HORDE ? NPC_TOR_GREYCLOUD : NPC_EIVI_NIGHTFEATHER;
case NPC_ELLIE_NIGHTFEATHER:
return instance->GetTeamInInstance() == HORDE ? NPC_KAR_GREYCLOUD : NPC_ELLIE_NIGHTFEATHER;
case NPC_ELEMENTALIST_MAHFUUN:
return instance->GetTeamInInstance() == HORDE ? NPC_SPIRITWALKER_TARA : NPC_ELEMENTALIST_MAHFUUN;
case NPC_ELEMENTALIST_AVUUN:
return instance->GetTeamInInstance() == HORDE ? NPC_SPIRITWALKER_YONA : NPC_ELEMENTALIST_AVUUN;
case NPC_MISSY_FLAMECUFFS:
return instance->GetTeamInInstance() == HORDE ? NPC_AMIRA_BLAZEWEAVER : NPC_MISSY_FLAMECUFFS;
case NPC_SISSY_FLAMECUFFS:
return instance->GetTeamInInstance() == HORDE ? NPC_VEESHA_BLAZEWEAVER : NPC_SISSY_FLAMECUFFS;
case NPC_FIELD_MEDIC_PENNY:
return instance->GetTeamInInstance() == HORDE ? NPC_BATTLE_PRIEST_ELIZA : NPC_FIELD_MEDIC_PENNY;
case NPC_FIELD_MEDIC_JESSI:
return instance->GetTeamInInstance() == HORDE ? NPC_BATTLE_PRIEST_GINA : NPC_FIELD_MEDIC_JESSI;
case NPC_MERCENARY_CAPTAIN_H:
return instance->GetTeamInInstance() == HORDE ? NPC_MERCENARY_CAPTAIN_A : NPC_MERCENARY_CAPTAIN_H;
case NPC_MERCENARY_SOLDIER_H:
@@ -581,6 +565,22 @@ class instance_ulduar : public InstanceMapScript
flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED);
break;
// Hodir Event triggers
case EVENT_INITIAL_AGGRO_HODIR:
if (Creature* hodir = GetCreature(DATA_HODIR))
hodir->AI()->DoAction(ACTION_INITIAL_AGGRO_HODIR);
break;
case EVENT_CACHE_SHATTERED:
if (Creature* hodir = GetCreature(DATA_HODIR))
hodir->AI()->DoAction(ACTION_CACHE_SHATTERED);
if (GameObject* hodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
hodirRareCache->ActivateObject(GameObjectActions::Despawn, 0);
break;
case EVENT_FLASH_FREEZE_FINISHED:
if (Creature* hodir = GetCreature(DATA_HODIR))
hodir->AI()->DoAction(ACTION_FLASH_FREEZE_FINISHED);
break;
// Yogg-Saron Event triggers
case EVENT_ACTIVATE_SANITY_WELL:
if (Creature* freya = instance->GetCreature(KeeperGUIDs[0]))
@@ -641,11 +641,10 @@ class instance_ulduar : public InstanceMapScript
case DATA_HODIR:
if (state == DONE)
{
if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
if (GetData(DATA_HODIR_RARE_CACHE))
HodirRareCache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID))
HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());
if (GameObject* hodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
hodirRareCache->ActivateObject(GameObjectActions::MakeActive, 0);
if (GameObject* hodirChest = instance->GetGameObject(HodirChestGUID))
hodirChest->ActivateObject(GameObjectActions::MakeActive, 0);
instance->SummonCreature(NPC_HODIR_OBSERVATION_RING, ObservationRingKeepersPos[1]);
}
@@ -732,15 +731,6 @@ class instance_ulduar : public InstanceMapScript
_events.ScheduleEvent(EVENT_LEVIATHAN_BREAK_DOOR, 5s);
}
break;
case DATA_HODIR_RARE_CACHE:
HodirRareCacheData = data;
if (!HodirRareCacheData)
{
if (Creature* hodir = GetCreature(DATA_HODIR))
if (GameObject* gameObject = instance->GetGameObject(HodirRareCacheGUID))
hodir->RemoveGameObject(gameObject, false);
}
break;
case DATA_UNBROKEN:
Unbroken = data != 0;
break;
@@ -823,8 +813,6 @@ class instance_ulduar : public InstanceMapScript
{
case DATA_COLOSSUS:
return ColossusData;
case DATA_HODIR_RARE_CACHE:
return HodirRareCacheData;
case DATA_UNBROKEN:
return uint32(Unbroken);
case DATA_ILLUSION:
@@ -331,17 +331,23 @@ enum UUEventIds
EVENT_TOWER_OF_FROST_DESTROYED = 21032,
EVENT_TOWER_OF_FLAMES_DESTROYED = 21033,
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
EVENT_INITIAL_AGGRO_HODIR = 21045,
EVENT_CACHE_SHATTERED = 20907,
EVENT_FLASH_FREEZE_FINISHED = 20896,
EVENT_ACTIVATE_SANITY_WELL = 21432,
EVENT_HODIRS_PROTECTIVE_GAZE_PROC = 21437,
};
enum LeviathanActions
enum UUActions
{
ACTION_TOWER_OF_STORM_DESTROYED = 1,
ACTION_TOWER_OF_FROST_DESTROYED = 2,
ACTION_TOWER_OF_FLAMES_DESTROYED = 3,
ACTION_TOWER_OF_LIFE_DESTROYED = 4,
ACTION_MOVE_TO_CENTER_POSITION = 10,
ACTION_INITIAL_AGGRO_HODIR = 3284500,
ACTION_CACHE_SHATTERED = 3284501,
ACTION_FLASH_FREEZE_FINISHED = 3284502
};
enum UlduarAchievementCriteriaIds
@@ -410,9 +416,6 @@ enum UlduarData
DATA_MOLGEIM,
DATA_BRUNDIR,
// Hodir
DATA_HODIR_RARE_CACHE,
// Mimiron
DATA_LEVIATHAN_MK_II,
DATA_VX_001,
@@ -465,12 +468,22 @@ enum UlduarData
DATA_BRONZEBEARD_RADIO
};
enum UlduarGameEvents
{
EVENT_ID_ENGAGE_HODIR = 20905
};
enum UlduarWorldStates
{
WORLD_STATE_FLAME_LEVIATHAN_DESTROYED_TOWERS = 4129,
WORLD_STATE_YOGG_SARON_KEEPERS = 4116,
WORLD_STATE_ULDUAR_TEAM_IN_INSTANCE = 4016,
WORLD_STATE_ALGALON_DESPAWN_TIMER = 4131,
WORLD_STATE_ALGALON_TIMER_ENABLED = 5636,
WORLD_STATE_HODIR_GETTING_COLD_FAILED = 4144,
WORLD_STATE_HODIR_CHEESE_THE_FREEZE_FAILED = 4145,
WORLD_STATE_HODIR_COOLEST_FRIENDS_FAILED = 4146,
WORLD_STATE_HODIR_THIS_CACHE_WAS_RARE_FAILED = 4203,
WORLD_STATE_FLAME_LEVIATHAN_DESTROYED_TOWERS = 4129,
WORLD_STATE_YOGG_SARON_KEEPERS = 4116,
};
enum UlduarAchievementData