aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp1
-rw-r--r--src/server/game/Entities/Object/Object.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Maps/Map.cpp26
-rw-r--r--src/server/game/Maps/Map.h1
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
7 files changed, 24 insertions, 28 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 61853e2eeb7..e4e13390c78 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -948,6 +948,7 @@ void WorldObject::ProcessPositionDataChanged(PositionFullTerrainStatus const& da
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(m_areaId))
if (area->ParentAreaID)
m_zoneId = area->ParentAreaID;
+ m_outdoors = data.outdoors;
m_staticFloorZ = data.floorZ;
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 011ad813947..5f46af426d8 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -445,6 +445,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
uint32 GetZoneId() const { return m_zoneId; }
uint32 GetAreaId() const { return m_areaId; }
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; }
+ bool IsOutdoors() const { return m_outdoors; }
bool IsInWorldPvpZone() const;
InstanceScript* GetInstanceScript() const;
@@ -548,10 +549,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
void DestroyForNearbyPlayers();
virtual void UpdateObjectVisibility(bool forced = true);
- virtual void UpdateObjectVisibilityOnCreate()
- {
- UpdateObjectVisibility(true);
- }
+ virtual void UpdateObjectVisibilityOnCreate() { UpdateObjectVisibility(true); }
void UpdatePositionData();
void BuildUpdate(UpdateDataMapType&) override;
@@ -626,6 +624,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
uint32 m_zoneId;
uint32 m_areaId;
float m_staticFloorZ;
+ bool m_outdoors;
//these functions are used mostly for Relocate() and Corpse/Player specific stuff...
//use them ONLY in LoadFromDB()/Create() funcs and nowhere else!
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 37c3b88710f..6d606e3c647 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6151,16 +6151,11 @@ void Player::CheckAreaExploreAndOutdoor()
if (IsInFlight())
return;
- bool isOutdoor;
- uint32 areaId = GetMap()->GetAreaId(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), &isOutdoor);
- AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
-
- if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !isOutdoor)
+ if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !IsOutdoors())
RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY);
- if (!areaId)
- return;
-
+ uint32 const areaId = GetAreaId();
+ AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
if (!areaEntry)
{
TC_LOG_ERROR("entities.player", "Player '%s' (%s) discovered unknown area (x: %f y: %f z: %f map: %u)",
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 8c1d6aae417..1d946f278b9 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2549,10 +2549,8 @@ float Map::GetMinHeight(PhaseShift const& phaseShift, float x, float y)
return -500.0f;
}
-inline bool IsOutdoorWMO(uint32 mogpFlags, int32 /*adtId*/, int32 /*rootId*/, int32 /*groupId*/, WMOAreaTableEntry const* wmoEntry, AreaTableEntry const* atEntry)
+inline bool IsOutdoorWMO(uint32 mogpFlags, WMOAreaTableEntry const* wmoEntry, AreaTableEntry const* atEntry)
{
- bool outdoor = true;
-
if (wmoEntry && atEntry)
{
if (atEntry->Flags[0] & AREA_FLAG_OUTSIDE)
@@ -2561,16 +2559,14 @@ inline bool IsOutdoorWMO(uint32 mogpFlags, int32 /*adtId*/, int32 /*rootId*/, in
return false;
}
- outdoor = (mogpFlags & 0x8) != 0;
-
if (wmoEntry)
{
if (wmoEntry->Flags & 4)
return true;
if (wmoEntry->Flags & 2)
- outdoor = false;
+ return false;
}
- return outdoor;
+ return (mogpFlags & 0x8);
}
bool Map::IsOutdoors(PhaseShift const& phaseShift, float x, float y, float z)
@@ -2583,13 +2579,13 @@ bool Map::IsOutdoors(PhaseShift const& phaseShift, float x, float y, float z)
return true;
AreaTableEntry const* atEntry = nullptr;
- WMOAreaTableEntry const* wmoEntry= sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId);
+ WMOAreaTableEntry const* wmoEntry = sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId);
if (wmoEntry)
{
TC_LOG_DEBUG("maps", "Got WMOAreaTableEntry! flag %u, areaid %u", wmoEntry->Flags, wmoEntry->AreaTableID);
atEntry = sAreaTableStore.LookupEntry(wmoEntry->AreaTableID);
}
- return IsOutdoorWMO(mogpFlags, adtId, rootId, groupId, wmoEntry, atEntry);
+ return IsOutdoorWMO(mogpFlags, wmoEntry, atEntry);
}
bool Map::GetAreaInfo(PhaseShift const& phaseShift, float x, float y, float z, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId)
@@ -2672,7 +2668,7 @@ uint32 Map::GetAreaId(PhaseShift const& phaseShift, float x, float y, float z, b
if (isOutdoors)
{
if (haveAreaInfo)
- *isOutdoors = IsOutdoorWMO(mogpFlags, adtId, rootId, groupId, wmoEntry, atEntry);
+ *isOutdoors = IsOutdoorWMO(mogpFlags, wmoEntry, atEntry);
else
*isOutdoors = true;
}
@@ -2807,18 +2803,19 @@ void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x,
// area lookup
AreaTableEntry const* areaEntry = nullptr;
+ WMOAreaTableEntry const* wmoEntry = nullptr;
if (vmapData.areaInfo && (z <= mapHeight || mapHeight <= vmapData.floorZ))
- if (WMOAreaTableEntry const* wmoEntry = sDB2Manager.GetWMOAreaTable(vmapData.areaInfo->rootId, vmapData.areaInfo->adtId, vmapData.areaInfo->groupId))
+ if ((wmoEntry = sDB2Manager.GetWMOAreaTable(vmapData.areaInfo->rootId, vmapData.areaInfo->adtId, vmapData.areaInfo->groupId)))
areaEntry = sAreaTableStore.LookupEntry(wmoEntry->AreaTableID);
if (areaEntry)
{
- data.floorZ = vmapData.floorZ;
data.areaId = areaEntry->ID;
+ data.floorZ = vmapData.floorZ;
+ data.outdoors = IsOutdoorWMO(vmapData.areaInfo->mogpFlags, wmoEntry, areaEntry);
}
else
{
- data.floorZ = mapHeight;
if (gmap)
data.areaId = gmap->getArea(x, y);
else
@@ -2829,6 +2826,9 @@ void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x,
if (data.areaId)
areaEntry = sAreaTableStore.LookupEntry(data.areaId);
+
+ data.floorZ = mapHeight;
+ data.outdoors = true; // @todo default true taken from old GetAreaId check, maybe review
}
// liquid processing
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 419073adf19..3362670dbb3 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -114,6 +114,7 @@ struct PositionFullTerrainStatus
uint32 areaId;
float floorZ;
+ bool outdoors;
ZLiquidStatus liquidStatus;
Optional<AreaInfo> areaInfo;
Optional<LiquidData> liquidInfo;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index aff37de3ca9..b62aaf65bc0 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5044,11 +5044,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
if (m_caster->GetTypeId() == TYPEID_PLAYER && VMAP::VMapFactory::createOrGetVMapManager()->isLineOfSightCalcEnabled())
{
if (m_spellInfo->HasAttribute(SPELL_ATTR0_OUTDOORS_ONLY) &&
- !m_caster->GetMap()->IsOutdoors(m_caster->GetPhaseShift(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ()))
+ !m_caster->IsOutdoors())
return SPELL_FAILED_ONLY_OUTDOORS;
if (m_spellInfo->HasAttribute(SPELL_ATTR0_INDOORS_ONLY) &&
- m_caster->GetMap()->IsOutdoors(m_caster->GetPhaseShift(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ()))
+ m_caster->IsOutdoors())
return SPELL_FAILED_ONLY_INDOORS;
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 14e64069619..95dcf69e05d 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -274,7 +274,7 @@ public:
if (haveVMap)
{
- if (map->IsOutdoors(object->GetPhaseShift(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()))
+ if (object->IsOutdoors())
handler->PSendSysMessage(LANG_GPS_POSITION_OUTDOORS);
else
handler->PSendSysMessage(LANG_GPS_POSITION_INDOORS);