diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 2 |
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); |