*Try to fix the bug of visibility update.
--HG-- branch : trunk
This commit is contained in:
@@ -1735,6 +1735,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
|||||||
|
|
||||||
ResetContestedPvP();
|
ResetContestedPvP();
|
||||||
|
|
||||||
|
DestroyForNearbyPlayers();
|
||||||
|
m_clientGUIDs.clear();
|
||||||
|
|
||||||
// remove player from battleground on far teleport (when changing maps)
|
// remove player from battleground on far teleport (when changing maps)
|
||||||
if(BattleGround const* bg = GetBattleGround())
|
if(BattleGround const* bg = GetBattleGround())
|
||||||
{
|
{
|
||||||
|
|||||||
+19
-21
@@ -9967,6 +9967,24 @@ bool Unit::canDetectStealthOf(Unit const* target, float distance) const
|
|||||||
return distance < visibleDistance;
|
return distance < visibleDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::DestroyForNearbyPlayers()
|
||||||
|
{
|
||||||
|
if(!IsInWorld())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::list<Unit*> targets;
|
||||||
|
Trinity::AnyUnitInObjectRangeCheck check(this, World::GetMaxVisibleDistance());
|
||||||
|
Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(targets, check);
|
||||||
|
VisitNearbyWorldObject(World::GetMaxVisibleDistance(), searcher);
|
||||||
|
for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter)
|
||||||
|
if(*iter != this && (*iter)->GetTypeId() == TYPEID_PLAYER
|
||||||
|
&& ((Player*)(*iter))->HaveAtClient(this))
|
||||||
|
{
|
||||||
|
DestroyForPlayer((Player*)(*iter));
|
||||||
|
((Player*)(*iter))->m_clientGUIDs.erase(GetGUID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Unit::SetVisibility(UnitVisibility x)
|
void Unit::SetVisibility(UnitVisibility x)
|
||||||
{
|
{
|
||||||
m_Visibility = x;
|
m_Visibility = x;
|
||||||
@@ -9975,27 +9993,7 @@ void Unit::SetVisibility(UnitVisibility x)
|
|||||||
SetToNotify();
|
SetToNotify();
|
||||||
|
|
||||||
if(x == VISIBILITY_GROUP_STEALTH)
|
if(x == VISIBILITY_GROUP_STEALTH)
|
||||||
{
|
DestroyForNearbyPlayers();
|
||||||
std::list<Unit*> targets;
|
|
||||||
Trinity::AnyUnitInObjectRangeCheck check(this, World::GetMaxVisibleDistance());
|
|
||||||
Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(targets, check);
|
|
||||||
VisitNearbyWorldObject(World::GetMaxVisibleDistance(), searcher);
|
|
||||||
for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter)
|
|
||||||
if(*iter != this && (*iter)->GetTypeId() == TYPEID_PLAYER
|
|
||||||
&& ((Player*)(*iter))->HaveAtClient(this))
|
|
||||||
{
|
|
||||||
DestroyForPlayer((Player*)(*iter));
|
|
||||||
((Player*)(*iter))->m_clientGUIDs.erase(GetGUID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*{
|
|
||||||
Map *m = GetMap();
|
|
||||||
|
|
||||||
if(GetTypeId()==TYPEID_PLAYER)
|
|
||||||
m->PlayerRelocation((Player*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
|
|
||||||
else
|
|
||||||
m->CreatureRelocation((Creature*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
|
void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
|
||||||
|
|||||||
@@ -1214,6 +1214,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
// Visibility system
|
// Visibility system
|
||||||
UnitVisibility GetVisibility() const { return m_Visibility; }
|
UnitVisibility GetVisibility() const { return m_Visibility; }
|
||||||
void SetVisibility(UnitVisibility x);
|
void SetVisibility(UnitVisibility x);
|
||||||
|
void DestroyForNearbyPlayers();
|
||||||
|
|
||||||
// common function for visibility checks for player/creatures with detection code
|
// common function for visibility checks for player/creatures with detection code
|
||||||
virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
|
virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
|
||||||
|
|||||||
@@ -255,6 +255,8 @@ void WorldSession::LogoutPlayer(bool Save)
|
|||||||
// Remove any possession of this player on logout
|
// Remove any possession of this player on logout
|
||||||
_player->RemoveCharmedOrPossessedBy(NULL);
|
_player->RemoveCharmedOrPossessedBy(NULL);
|
||||||
|
|
||||||
|
_player->DestroyForNearbyPlayers();
|
||||||
|
|
||||||
if (uint64 lguid = GetPlayer()->GetLootGUID())
|
if (uint64 lguid = GetPlayer()->GetLootGUID())
|
||||||
DoLootRelease(lguid);
|
DoLootRelease(lguid);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user