Hide the infernal golem dummies in the Cooking Meat field.

This commit is contained in:
luis
2026-09-23 17:54:55 -03:00
parent 11a25ded12
commit 1c1756a1b5
@@ -21,10 +21,100 @@
@TODO: Use conversations instead of scheduled talk
*/
#include "CellImpl.h"
#include "GridNotifiersImpl.h"
#include "Loot.h"
#include "exiles_reach.h"
#include <cctype>
#include <initializer_list>
#include <set>
#include <string>
namespace
{
uint32 constexpr NPC_COASTAL_GOAT = 161130;
uint32 constexpr NPC_PRICKLY_PORCUPINE = 161131;
bool IsExileCampWildlifeOrNpc(uint32 entry)
{
switch (entry)
{
case NPC_COASTAL_GOAT:
case NPC_PRICKLY_PORCUPINE:
case NPC_ABANDONED_CAMP_ALARIA:
case NPC_ABANDONED_CAMP_WONSA:
case NPC_ABANDONED_CAMP_GARRICK:
case NPC_ABANDONED_CAMP_BREKA:
case NPC_ABANDONED_CAMP_GARRICK_WALKING:
case NPC_ABANDONED_CAMP_BREKA_WALKING:
case NPC_ABANDONED_CAMP_ALARIA_2: // 175031, Alaria after she has eaten
case 175030: // Won'sa after she has eaten
case 161265: // Jrok'gar
return true;
default:
return false;
}
}
bool IsExileCampGolemDummy(Creature const* creature)
{
if (!creature || creature->IsSummon() || creature->IsPet())
return false;
if (IsExileCampWildlifeOrNpc(creature->GetEntry()))
return false;
std::string name = creature->GetName();
for (char& character : name)
character = char(std::tolower(static_cast<unsigned char>(character)));
if (creature->IsTrigger() || creature->GetCreatureTemplate()->family == CREATURE_FAMILY_INFERNAL)
return true;
// Display 169 is infernal.m2. Anchors fall back to it when their invisible model is missing.
if (creature->GetDisplayId() == 169)
return true;
if (name.find("golem") != std::string::npos || name.find("infernal") != std::string::npos || name.find("dummy") != std::string::npos)
return true;
// Spell anchors keep an infernal model when the invisibility aura never applied.
return name.find("bunny") != std::string::npos || name.find("stalker") != std::string::npos || name.find("trigger") != std::string::npos;
}
void HideExileCampGolemDummies(Player* player)
{
std::list<Creature*> creatures;
Trinity::AnyUnitInObjectRangeCheck check(player, 150.0f, false, false);
Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(player, creatures, check);
Cell::VisitAllObjects(player, searcher, 150.0f);
for (Creature* creature : creatures)
{
if (!creature || !player->CanSeeOrDetect(creature))
continue;
if (creature->GetEntry() == NPC_COASTAL_GOAT || creature->GetEntry() == NPC_PRICKLY_PORCUPINE)
{
if (creature->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))
creature->SetUninteractible(false);
continue;
}
if (IsExileCampGolemDummy(creature))
creature->SetVisible(false);
}
}
void RemoveExilePhases(Player* player, std::initializer_list<uint32> phases)
{
for (uint32 phaseId : phases)
if (player->GetPhaseShift().HasPhase(phaseId))
PhasingHandler::RemovePhase(player, phaseId, true);
}
}
class exiles_reach_abandoned_camp_playerscript : public PlayerScript
{
@@ -40,25 +130,65 @@ public:
{
case AREA_ABANDONED_CAMP:
{
WowCommunity::PhaseShift(player, { PHASE_GENERAL_SHORE }, false);
// Later and earlier stages were left on, so their untargetable infernal anchors
// were drawn across the wildlife field as soon as Cooking Meat started.
RemoveExilePhases(player,
{
PHASE_GENERAL_SHORE,
PHASE_ALLIANCE_SHORE_GARRICK_AND_FRIENDS_INJURED,
PHASE_ALLIANCE_SHORE_GARRICK_AND_FRIENDS_HEALED,
PHASE_ALLIANCE_SHORE_12940,
PHASE_ALLIANCE_SHORE_13157,
PHASE_ALLIANCE_SHORE_13503,
PHASE_HORDE_SHORE_UNK,
PHASE_HORDE_SHORE_BREKA_AND_FRIENDS_INJURED,
PHASE_HORDE_SHORE_BREKA_AND_FRIENDS_HEALED,
PHASE_GENERAL_SHIP,
PHASE_ALLIANCE_SHIP_CREW_OUTSIDE,
PHASE_ALLIANCE_SHIP_COLE,
PHASE_ALLIANCE_SHIP_GARRICK_1,
PHASE_ALLIANCE_SHIP_13619,
PHASE_ALLIANCE_SHIP_14350,
PHASE_ALLIANCE_SHIP_13454,
PHASE_ALLIANCE_SHIP_GARRICK_2,
PHASE_ALLIANCE_SHIP_CREW_INSIDE,
PHASE_HORDE_SHIP_THROG,
PHASE_HORDE_SHIP_15514,
PHASE_HORDE_SHIP_15287,
PHASE_HORDE_SHIP_15516,
PHASE_GENERAL_QUILBOAR_BRIARPATCH,
PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_AUSTIN,
PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_GARRICK,
PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_15276,
PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_16917,
PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_SPRINGSTOCK,
PHASE_HORDE_QUILBOAR_BRIARPATCH_FIZZLEPOP,
PHASE_HORDE_QUILBOAR_BRIARPATCH_15477,
PHASE_HORDE_QUILBOAR_BRIARPATCH_MITHDRAN,
PHASE_HORDE_QUILBOAR_BRIARPATCH_BREKA_ARRIVED,
PHASE_GENERAL_DARKMAUL_PLAINS_MOBS,
PHASE_GENERAL_DARKMAUL_PLAINS_ZOMBIES_AND_CADAVERS,
PHASE_GENERAL_DARKMAUL_CITADEL_GORGROTH_AND_FRIENDS,
PHASE_HORDE_DARKMAUL_CITADEL_GORGROTH_AND_FRIENDS_COOKING_AREA,
PHASE_ALLIANCE_DARKMAUL_CITADEL_GORGROTH_AND_FRIENDS_SUMMON,
});
if (player->IsInHorde())
{
WowCommunity::PhaseShift(player, { PHASE_HORDE_SHORE_UNK }, true);;
WowCommunity::PhaseShift(player, { PHASE_HORDE_ABANDONED_CAMP_15324 }, true);
WowCommunity::PhaseShift(player, { PHASE_HORDE_ABANDONED_CAMP_WONSA_STARVING }, !QuestRewarded(player, QUEST_H_COOKING_MEAT));
WowCommunity::PhaseShift(player, { PHASE_HORDE_ABANDONED_CAMP_WONSA_EATEN }, QuestRewarded(player, QUEST_H_COOKING_MEAT));
WowCommunity::PhaseShift(player, { PHASE_HORDE_ABANDONED_CAMP_BREKA_PEACEFUL }, QuestCompletedOrRewarded(player, QUEST_H_FINDING_THE_LOST_EXPEDITION) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_BREKA) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_BREKA_WALKING) && !player->GetSummonedCreatureByEntry(NPC_MURLOC_HIDEAWAY_BREKA) && !player->GetQuestStatus(QUEST_H_NORTHBOUND));
WowCommunity::PhaseShift(player, { PHASE_HORDE_QUILBOAR_BRIARPATCH_MITHDRAN }, !QuestRewarded(player, QUEST_H_NORTHBOUND));
WowCommunity::PhaseShift(player, { PHASE_HORDE_ABANDONED_CAMP_BREKA_PEACEFUL }, QuestCompletedOrRewarded(player, QUEST_H_FINDING_THE_LOST_EXPEDITION) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_BREKA) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_BREKA_WALKING) && !player->GetSummonedCreatureByEntry(NPC_MURLOC_HIDEAWAY_BREKA) && player->GetQuestStatus(QUEST_H_NORTHBOUND) == QUEST_STATUS_NONE);
}
if (player->IsInAlliance())
{
WowCommunity::PhaseShift(player, { PHASE_ALLIANCE_ABANDONED_CAMP_ALARIA_STARVING }, !QuestRewarded(player, QUEST_COOKING_MEAT));
WowCommunity::PhaseShift(player, { PHASE_ALLIANCE_ABANDONED_CAMP_ALARIA_EATEN }, QuestRewarded(player, QUEST_COOKING_MEAT));
WowCommunity::PhaseShift(player, { PHASE_ALLIANCE_ABANDONED_CAMP_GARRICK_PEACEFUL }, QuestCompletedOrRewarded(player, QUEST_FINDING_THE_LOST_EXPEDITION) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_GARRICK) && !player->GetSummonedCreatureByEntry(NPC_MURLOC_HIDEAWAY_GARRICK) && !player->GetQuestStatus(QUEST_NORTHBOUND));
WowCommunity::PhaseShift(player, { PHASE_ALLIANCE_QUILBOAR_BRIARPATCH_AUSTIN }, !QuestRewarded(player, QUEST_NORTHBOUND));
WowCommunity::PhaseShift(player, { PHASE_ALLIANCE_ABANDONED_CAMP_GARRICK_PEACEFUL }, QuestCompletedOrRewarded(player, QUEST_FINDING_THE_LOST_EXPEDITION) && !player->GetSummonedCreatureByEntry(NPC_ABANDONED_CAMP_GARRICK) && !player->GetSummonedCreatureByEntry(NPC_MURLOC_HIDEAWAY_GARRICK) && player->GetQuestStatus(QUEST_NORTHBOUND) == QUEST_STATUS_NONE);
}
HideExileCampGolemDummies(player);
}
break;
}