mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Use 2D distance for visibility checks
This commit is contained in:
parent
a69bc59f1d
commit
df3ca15c3d
9 changed files with 88 additions and 24 deletions
|
|
@ -204,6 +204,7 @@ inline void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
if(fourcc==0x4d435654) // MCVT
|
if(fourcc==0x4d435654) // MCVT
|
||||||
{
|
{
|
||||||
for (int j=0; j<17; ++j)
|
for (int j=0; j<17; ++j)
|
||||||
|
{
|
||||||
for (int i=0; i<((j%2)?8:9); ++i)
|
for (int i=0; i<((j%2)?8:9); ++i)
|
||||||
{
|
{
|
||||||
mf.read(&h,4);
|
mf.read(&h,4);
|
||||||
|
|
@ -226,6 +227,7 @@ inline void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
if(z>zmax)zmax=z;
|
if(z>zmax)zmax=z;
|
||||||
//if(z<zmin)zmin=z;
|
//if(z<zmin)zmin=z;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(fourcc==0x4d434e52) // MCNR
|
else if(fourcc==0x4d434e52) // MCNR
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -209,5 +209,5 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields)
|
||||||
|
|
||||||
bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const
|
bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const
|
||||||
{
|
{
|
||||||
return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f));
|
return IsInWorld() && u->IsInWorld() && IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -148,5 +148,5 @@ void DynamicObject::Delay(int32 delaytime)
|
||||||
|
|
||||||
bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const
|
bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const
|
||||||
{
|
{
|
||||||
return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f));
|
return IsInWorld() && u->IsInWorld() && IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -738,7 +738,7 @@ bool GameObject::isVisibleForInState(Player const* u, bool inVisibleList) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// check distance
|
// check distance
|
||||||
return IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject() +
|
return IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForObject() +
|
||||||
(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f) );
|
(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1119,6 +1119,19 @@ bool WorldObject::IsWithinDistInMap(const WorldObject* obj, const float dist2com
|
||||||
return distsq < maxdist * maxdist;
|
return distsq < maxdist * maxdist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WorldObject::IsWithinDistInMap2d(const WorldObject* obj, const float dist2compare) const
|
||||||
|
{
|
||||||
|
if (!obj || !IsInMap(obj)) return false;
|
||||||
|
|
||||||
|
float dx = GetPositionX() - obj->GetPositionX();
|
||||||
|
float dy = GetPositionY() - obj->GetPositionY();
|
||||||
|
float distsq = dx*dx + dy*dy;
|
||||||
|
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||||
|
float maxdist = dist2compare + sizefactor;
|
||||||
|
|
||||||
|
return distsq < maxdist * maxdist;
|
||||||
|
}
|
||||||
|
|
||||||
bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) const
|
bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) const
|
||||||
{
|
{
|
||||||
if (!IsInMap(obj)) return false;
|
if (!IsInMap(obj)) return false;
|
||||||
|
|
|
||||||
|
|
@ -418,6 +418,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object
|
||||||
float GetDistanceZ(const WorldObject* obj) const;
|
float GetDistanceZ(const WorldObject* obj) const;
|
||||||
bool IsInMap(const WorldObject* obj) const { return GetMapId()==obj->GetMapId() && GetInstanceId()==obj->GetInstanceId(); }
|
bool IsInMap(const WorldObject* obj) const { return GetMapId()==obj->GetMapId() && GetInstanceId()==obj->GetInstanceId(); }
|
||||||
bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const;
|
bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const;
|
||||||
|
bool IsWithinDistInMap2d(const WorldObject* obj, const float dist2compare) const;
|
||||||
bool IsWithinLOS(const float x, const float y, const float z ) const;
|
bool IsWithinLOS(const float x, const float y, const float z ) const;
|
||||||
bool IsWithinLOSInMap(const WorldObject* obj) const;
|
bool IsWithinLOSInMap(const WorldObject* obj) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8547,7 +8547,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal)
|
||||||
return gain;
|
return gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList) const
|
bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is2dDistance) const
|
||||||
{
|
{
|
||||||
if(!u)
|
if(!u)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -8598,40 +8598,88 @@ bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList)
|
||||||
if(u->isInFlight()) // what see player in flight
|
if(u->isInFlight()) // what see player in flight
|
||||||
{
|
{
|
||||||
// use object grey distance for all (only see objects any way)
|
// use object grey distance for all (only see objects any way)
|
||||||
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(!isAlive()) // distance for show body
|
else if(!isAlive()) // distance for show body
|
||||||
{
|
{
|
||||||
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(GetTypeId()==TYPEID_PLAYER) // distance for show player
|
else if(GetTypeId()==TYPEID_PLAYER) // distance for show player
|
||||||
{
|
{
|
||||||
if(u->GetTypeId()==TYPEID_PLAYER)
|
if(u->GetTypeId()==TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
// Players far than max visible distance for player or not in our map are not visible too
|
// Players far than max visible distance for player or not in our map are not visible too
|
||||||
if (!at_same_transport && !IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!at_same_transport && !IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!at_same_transport && !IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Units far than max visible distance for creature or not in our map are not visible too
|
// Units far than max visible distance for creature or not in our map are not visible too
|
||||||
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(GetCharmerOrOwnerGUID()) // distance for show pet/charmed
|
else if(GetCharmerOrOwnerGUID()) // distance for show pet/charmed
|
||||||
{
|
{
|
||||||
// Pet/charmed far than max visible distance for player or not in our map are not visible too
|
// Pet/charmed far than max visible distance for player or not in our map are not visible too
|
||||||
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else // distance for show creature
|
else // distance for show creature
|
||||||
{
|
{
|
||||||
// Units far than max visible distance for creature or not in our map are not visible too
|
// Units far than max visible distance for creature or not in our map are not visible too
|
||||||
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
if(is2dDistance)
|
||||||
return false;
|
{
|
||||||
|
if (!IsWithinDistInMap2d(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Visible units, always are visible for all units, except for units under invisibility
|
// Visible units, always are visible for all units, except for units under invisibility
|
||||||
|
|
@ -9444,7 +9492,7 @@ Unit* Unit::GetUnit(WorldObject& object, uint64 guid)
|
||||||
|
|
||||||
bool Unit::isVisibleForInState( Player const* u, bool inVisibleList ) const
|
bool Unit::isVisibleForInState( Player const* u, bool inVisibleList ) const
|
||||||
{
|
{
|
||||||
return isVisibleForOrDetect(u,false,inVisibleList);
|
return isVisibleForOrDetect(u, false, inVisibleList, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Unit::GetCreatureType() const
|
uint32 Unit::GetCreatureType() const
|
||||||
|
|
|
||||||
|
|
@ -1139,7 +1139,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
void SetVisibility(UnitVisibility x);
|
void SetVisibility(UnitVisibility x);
|
||||||
|
|
||||||
// common function for visibility checks for player/creatures with detection code
|
// common function for visibility checks for player/creatures with detection code
|
||||||
bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false) const;
|
bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is2dDistance = false) const;
|
||||||
bool canDetectInvisibilityOf(Unit const* u) const;
|
bool canDetectInvisibilityOf(Unit const* u) const;
|
||||||
|
|
||||||
// virtual functions for all world objects types
|
// virtual functions for all world objects types
|
||||||
|
|
|
||||||
|
|
@ -869,9 +869,9 @@ GM.StartLevel = 1
|
||||||
# Visibility.Distance.Creature
|
# Visibility.Distance.Creature
|
||||||
# Visibility.Distance.Player
|
# Visibility.Distance.Player
|
||||||
# Visibility distance for different in game object
|
# Visibility distance for different in game object
|
||||||
# Max limited by active player zone: ~ 166
|
# Max limited by active player zone: ~ 333
|
||||||
# Min limit dependent from objects
|
# Min limit dependent from objects
|
||||||
# Default: 66 (cell size)
|
# Default: 132 (cell size)
|
||||||
# Min limit is max aggro radius (45) * Rate.Creature.Aggro
|
# Min limit is max aggro radius (45) * Rate.Creature.Aggro
|
||||||
#
|
#
|
||||||
# Visibility.Distance.Object
|
# Visibility.Distance.Object
|
||||||
|
|
@ -897,10 +897,10 @@ GM.StartLevel = 1
|
||||||
###################################################################################################################
|
###################################################################################################################
|
||||||
|
|
||||||
Visibility.GroupMode = 0
|
Visibility.GroupMode = 0
|
||||||
Visibility.Distance.Creature = 66
|
Visibility.Distance.Creature = 132
|
||||||
Visibility.Distance.Player = 66
|
Visibility.Distance.Player = 132
|
||||||
Visibility.Distance.Object = 66
|
Visibility.Distance.Object = 132
|
||||||
Visibility.Distance.InFlight = 66
|
Visibility.Distance.InFlight = 132
|
||||||
Visibility.Distance.Grey.Unit = 1
|
Visibility.Distance.Grey.Unit = 1
|
||||||
Visibility.Distance.Grey.Object = 10
|
Visibility.Distance.Grey.Object = 10
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue