WebSafe 3.7github.com
|
|
🏠
Skip to content

Ulduar - Boss Hodir: Multiple Issues (Hard Mode Chest, Flash Freeze Mechanics, Achievements) #31639

@Vladimir-Brumer

Description

@Vladimir-Brumer

Description

Core TDB 335.24081

There are several issues with the Hodir encounter:

  1. Hard Mode Chest Not Spawning: If the boss is killed faster than 3 minutes (Hard Mode condition), the additional treasure chests do not appear. This makes it impossible to obtain the "Hodir's Sigil" and complete the related progression.

  2. Incorrect Flash Freeze Mechanics for Friendly NPCs: Before the fight, friendly NPCs are frozen in the hall using a different spell system (SPELL_SUMMON_FLASH_FREEZE_HELPER -> npc_ice_block -> SPELL_FLASH_FREEZE_HELPER). They can be freed by breaking the ice at the start of the encounter.
    However, during the fight, when these same NPCs are hit by the "Flash Freeze" ability, a different, incorrect mechanic is applied (SPELL_SUMMON_BLOCK_OF_ICE -> npc_flash_freeze -> SPELL_BLOCK_OF_ICE). This ice block cannot be dispelled or broken by any means , leaving the NPCs permanently trapped until they die. This breaks several achievements that require keeping the NPCs alive.

  3. Achievements Not Awarded

Main Technical Difference:

Pre-combat freeze: Uses SPELL_SUMMON_FLASH_FREEZE_HELPER (61989) → npc_ice_block → SPELL_FLASH_FREEZE_HELPER (61990). This block is breakable.

In-combat freeze: Uses SPELL_SUMMON_BLOCK_OF_ICE (61970) → npc_flash_freeze → SPELL_BLOCK_OF_ICE (61969). This block is unbreakable and should not be used on friendly NPCs

Proposed Fixes (Potential Workarounds)

I have attempted to resolve the first two issues, but I'm unsure if my approach is correct:

  1. Fix for loot chests:
    Added the missing chests to the database:

INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(34160, 194200, 603, 0, 0, 1, 1, 2037.94, -201.466, 432.687, 3.30534, -0, -0, -0.99665, 0.08178, -604800, 255, 1, '', NULL, 0);

-- Для героического режима (25-чел)

INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(34161, 194201, 603, 0, 0, 2, 1, 2037.94, -201.466, 432.687, 3.30534, -0, -0, -0.99665, 0.08178, -604800, 255, 1, '', NULL, 0);

Modified instance_ulduar.cpp to ensure the chest spawns when conditions are met:

									case DATA_HODIR:
											if (state == DONE)
											{
													if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID)){
															if (GetData(DATA_HODIR_RARE_CACHE)){
																	HodirRareCache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
																	/*** ДОБАВИЛ ЧТОБЫ СУНДУКИ ПОКАЗЫВАЛИСЬ ***/
																	HodirRareCache->SetRespawnTime(HodirRareCache->GetRespawnDelay());
																	/***     окончание добавленного кода    ***/
															}

													}
													if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID))
															HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());

													instance->SummonCreature(NPC_HODIR_OBSERVATION_RING, ObservationRingKeepersPos[1]);
											}
...

  1. Fix for friendly NPC freeze mechanics:
    Modified boss_hodir.cpp in the FlashFreeze() function to use the pre-combat freeze mechanic for friendly NPCs, while keeping the combat mechanic for players:
					void FlashFreeze()
					{
							std::list<Unit*> TargetList;
							Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(me, me, 100.0f);
							Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
							Cell::VisitAllObjects(me, searcher, 100.0f);
							for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
							{
									Unit* target = *itr;
									if (!target || !target->IsAlive() || GetClosestCreatureWithEntry(target, NPC_SNOWPACKED_ICICLE, 5.0f))
											continue;

									if (target->HasAura(SPELL_FLASH_FREEZE_HELPER) || target->HasAura(SPELL_BLOCK_OF_ICE))
									{
											me->CastSpell(target, SPELL_FLASH_FREEZE_KILL, true);
											continue;
									}

									target->CastSpell(target, SPELL_SUMMON_BLOCK_OF_ICE, true);
							}
					}***/
					void FlashFreeze(){
						std::list<Unit*> TargetList;
						Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(me, me, 100.0f);
						Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
						Cell::VisitAllObjects(me, searcher, 100.0f);
						for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr){
							Unit* target = *itr;
							if (!target || !target->IsAlive() || GetClosestCreatureWithEntry(target, NPC_SNOWPACKED_ICICLE, 5.0f))
								continue;
							if (target->HasAura(SPELL_FLASH_FREEZE_HELPER) || target->HasAura(SPELL_BLOCK_OF_ICE)){
								me->CastSpell(target, SPELL_FLASH_FREEZE_KILL, true);
								continue;
							}
							// Определяем, является ли цель дружественным NPC
							bool isFriendlyNPC = false;
							if (target->GetTypeId() == TYPEID_UNIT){
								uint32 entry = target->ToCreature()->GetEntry();
								for (uint8 i = 0; i < 8; ++i){// Проверяем, является ли NPC одним из дружественных помощников
									if (entry == Entry[i]){
										isFriendlyNPC = true;
										break;
									}}}

							if (isFriendlyNPC){// Используем механику перед боем для дружественных NPC
								target->CastSpell(target, SPELL_SUMMON_FLASH_FREEZE_HELPER, true);
							}else{// Используем стандартную механику для игроков
								target->CastSpell(target, SPELL_SUMMON_BLOCK_OF_ICE, true);
							}
						}
					}


Result:
The missing loot chests now appear correctly.
Friendly NPCs can be freed from freeze during combat

Outstanding issue:
Achievements

p.s. Sorry my English

Expected behaviour

Killing Hodir in under 3 minutes should spawn additional treasure chests containing Hodir's Sigil.

Friendly NPCs (e.g., npc=32938) frozen by "Flash Freeze" during the encounter should be trapped in a breakable ice block, similar to the pre-combat state, allowing players to save them.

Achievements related to saving NPCs  and completing the hard mode should be awarded and oter 

Steps to reproduce the problem

Steps to Reproduce:

Engage Hodir in Ulduar.

Break NPCs out of the initial freeze quickly.

Let Hodir cast "Flash Freeze" on a friendly NPC.

Observe that the NPC is now permanently frozen by an unbreakable block.

Defeat Hodir in less than 3 minutes.

Observe the lack of additional chests and missing achievements.

Branch

3.3.5

TC rev. hash/commit

None

Operating system

Ubuntu server

Custom changes

Transmogrification, Reforging, GOMove, Passive Anticheat

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions