mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/Objects:
* store liquid status lookups from UpdatePositionData in a member and draw liquid status information from it instead of doing extra vmap lookups. This also fixes collision height based liquid status states which was leading to false positive movement speed selection for creatures * remove redundant IsUnderWater helper override from player class as our object based liquid status also considers collision height
This commit is contained in:
@@ -1185,8 +1185,8 @@ void MovementInfo::OutDebug()
|
||||
|
||||
WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), LastUsedScriptID(0),
|
||||
m_name(""), m_isActive(false), m_isFarVisible(false), m_isWorldObject(isWorldObject), m_zoneScript(nullptr),
|
||||
m_transport(nullptr), m_zoneId(0), m_areaId(0), m_staticFloorZ(VMAP_INVALID_HEIGHT), m_outdoors(true), m_currMap(nullptr),
|
||||
m_InstanceId(0), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0),
|
||||
m_transport(nullptr), m_zoneId(0), m_areaId(0), m_staticFloorZ(VMAP_INVALID_HEIGHT), m_outdoors(true), m_liquidStatus(LIQUID_MAP_NO_WATER),
|
||||
m_currMap(nullptr), m_InstanceId(0), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0),
|
||||
m_aiAnimKitId(0), m_movementAnimKitId(0), m_meleeAnimKitId(0)
|
||||
{
|
||||
m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE | GHOST_VISIBILITY_GHOST);
|
||||
@@ -1291,6 +1291,7 @@ void WorldObject::ProcessPositionDataChanged(PositionFullTerrainStatus const& da
|
||||
m_zoneId = area->ParentAreaID;
|
||||
m_outdoors = data.outdoors;
|
||||
m_staticFloorZ = data.floorZ;
|
||||
m_liquidStatus = data.liquidStatus;
|
||||
}
|
||||
|
||||
void WorldObject::AddToWorld()
|
||||
|
||||
@@ -55,6 +55,7 @@ class WorldPacket;
|
||||
class ZoneScript;
|
||||
struct PositionFullTerrainStatus;
|
||||
struct QuaternionData;
|
||||
enum ZLiquidStatus : uint32;
|
||||
|
||||
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
|
||||
|
||||
@@ -325,6 +326,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
|
||||
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; }
|
||||
ZLiquidStatus GetLiquidStatus() const { return m_liquidStatus; }
|
||||
|
||||
InstanceScript* GetInstanceScript() const;
|
||||
|
||||
@@ -504,6 +506,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
|
||||
uint32 m_areaId;
|
||||
float m_staticFloorZ;
|
||||
bool m_outdoors;
|
||||
ZLiquidStatus m_liquidStatus;
|
||||
|
||||
//these functions are used mostly for Relocate() and Corpse/Player specific stuff...
|
||||
//use them ONLY in LoadFromDB()/Create() funcs and nowhere else!
|
||||
|
||||
@@ -2245,12 +2245,6 @@ GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid const& guid, Gameo
|
||||
return go;
|
||||
}
|
||||
|
||||
bool Player::IsUnderWater() const
|
||||
{
|
||||
return IsInWater() &&
|
||||
GetPositionZ() < (GetMap()->GetWaterLevel(GetPhaseShift(), GetPositionX(), GetPositionY())-2);
|
||||
}
|
||||
|
||||
void Player::SetInWater(bool apply)
|
||||
{
|
||||
if (m_isInWater == apply)
|
||||
|
||||
@@ -1053,7 +1053,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
void SetInWater(bool apply);
|
||||
|
||||
bool IsInWater() const override { return m_isInWater; }
|
||||
bool IsUnderWater() const override;
|
||||
bool IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const;
|
||||
|
||||
void SendInitialPacketsBeforeAddToMap();
|
||||
|
||||
@@ -3312,12 +3312,12 @@ bool Unit::isInAccessiblePlaceFor(Creature const* c) const
|
||||
|
||||
bool Unit::IsInWater() const
|
||||
{
|
||||
return GetMap()->IsInWater(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ());
|
||||
return GetLiquidStatus() & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER);
|
||||
}
|
||||
|
||||
bool Unit::IsUnderWater() const
|
||||
{
|
||||
return GetMap()->IsUnderWater(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ());
|
||||
return GetLiquidStatus() & LIQUID_MAP_UNDER_WATER;
|
||||
}
|
||||
|
||||
void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
|
||||
|
||||
Reference in New Issue
Block a user