Hide the infernal golem dummies in the Cooking Meat field.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user