*Fix a crash caused by gm command .object move and so on
--HG-- branch : trunk
This commit is contained in:
+6
-16
@@ -638,13 +638,10 @@ bool ChatHandler::HandleGameObjectTurnCommand(const char* args)
|
|||||||
o = chr->GetOrientation();
|
o = chr->GetOrientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
Map* map = obj->GetMap();
|
|
||||||
map->Remove(obj,false);
|
|
||||||
|
|
||||||
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
|
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
|
||||||
obj->UpdateRotationFields();
|
obj->UpdateRotationFields();
|
||||||
|
obj->DestroyForNearbyPlayers();
|
||||||
map->Add(obj);
|
ObjectAccessor::UpdateObjectVisibility(obj);
|
||||||
|
|
||||||
obj->SaveToDB();
|
obj->SaveToDB();
|
||||||
obj->Refresh();
|
obj->Refresh();
|
||||||
@@ -686,13 +683,9 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
|
|||||||
if (!px)
|
if (!px)
|
||||||
{
|
{
|
||||||
Player *chr = m_session->GetPlayer();
|
Player *chr = m_session->GetPlayer();
|
||||||
|
|
||||||
Map* map = obj->GetMap();
|
|
||||||
map->Remove(obj,false);
|
|
||||||
|
|
||||||
obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation());
|
obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation());
|
||||||
|
obj->DestroyForNearbyPlayers();
|
||||||
map->Add(obj);
|
ObjectAccessor::UpdateObjectVisibility(obj);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -710,12 +703,9 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map* map = obj->GetMap();
|
|
||||||
map->Remove(obj,false);
|
|
||||||
|
|
||||||
obj->Relocate(x, y, z, obj->GetOrientation());
|
obj->Relocate(x, y, z, obj->GetOrientation());
|
||||||
|
obj->DestroyForNearbyPlayers();
|
||||||
map->Add(obj);
|
ObjectAccessor::UpdateObjectVisibility(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
obj->SaveToDB();
|
obj->SaveToDB();
|
||||||
|
|||||||
@@ -2303,3 +2303,32 @@ void WorldObject::PlayDirectSound( uint32 sound_id, Player* target /*= NULL*/ )
|
|||||||
else
|
else
|
||||||
SendMessageToSet( &data, true );
|
SendMessageToSet( &data, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldObject::DestroyForNearbyPlayers()
|
||||||
|
{
|
||||||
|
if(!IsInWorld())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::list<Unit*> targets;
|
||||||
|
Trinity::AnyUnitInObjectRangeCheck check(this, World::GetMaxVisibleDistance());
|
||||||
|
Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targets, check);
|
||||||
|
VisitNearbyWorldObject(World::GetMaxVisibleDistance(), searcher);
|
||||||
|
for(std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
|
||||||
|
{
|
||||||
|
Player *plr = dynamic_cast<Player*>(*iter);
|
||||||
|
if(!plr)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(plr == this)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!plr->HaveAtClient(this))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(isType(TYPEMASK_UNIT) && ((Unit*)this)->GetCharmerGUID() == plr->GetGUID()) // TODO: this is for puppet
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DestroyForPlayer(plr);
|
||||||
|
plr->m_clientGUIDs.erase(GetGUID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -556,6 +556,8 @@ class TRINITY_DLL_SPEC WorldObject : public Object
|
|||||||
void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& lList, uint32 uiEntry, float fMaxSearchRange);
|
void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& lList, uint32 uiEntry, float fMaxSearchRange);
|
||||||
void GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange);
|
void GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange);
|
||||||
|
|
||||||
|
void DestroyForNearbyPlayers();
|
||||||
|
|
||||||
bool isActiveObject() const { return m_isActive; }
|
bool isActiveObject() const { return m_isActive; }
|
||||||
void setActive(bool isActiveObject);
|
void setActive(bool isActiveObject);
|
||||||
void SetWorldObject(bool apply);
|
void SetWorldObject(bool apply);
|
||||||
|
|||||||
@@ -10845,25 +10845,6 @@ 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(this, targets, check);
|
|
||||||
VisitNearbyWorldObject(World::GetMaxVisibleDistance(), searcher);
|
|
||||||
for(std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
|
|
||||||
if(*iter != this && (*iter)->GetTypeId() == TYPEID_PLAYER
|
|
||||||
&& ((Player*)(*iter))->HaveAtClient(this)
|
|
||||||
&& GetCharmerGUID() != (*iter)->GetGUID()) // TODO: this is for puppet
|
|
||||||
{
|
|
||||||
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;
|
||||||
|
|||||||
@@ -1602,7 +1602,6 @@ 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 = 0;
|
virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user