aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-02 20:27:10 -0600
committermegamage <none@none>2009-04-02 20:27:10 -0600
commitf2e88cae5188b4b1d0451c4a760793a3d881b0b0 (patch)
tree2157a28e0742abee9c4a6ba6b9db0f696d4607f7 /src
parent43b9dbe31eb5b5648b6ca95e03ec41041b11589d (diff)
*Fix some visibility bug.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp3
-rw-r--r--src/game/Map.cpp64
-rw-r--r--src/game/Map.h3
-rw-r--r--src/game/Player.cpp2
-rw-r--r--src/game/Unit.cpp3
5 files changed, 43 insertions, 32 deletions
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
index b9f60813ee5..371af670a10 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
@@ -353,7 +353,8 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI
boss_priestess_guestAI(Creature* c) : ScriptedAI(c)
{
Group.clear();
- pInstance = ((ScriptedInstance*)c->GetInstanceData()); AcquireGUIDs();
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ AcquireGUIDs();
}
ScriptedInstance* pInstance;
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 4c7e1471d4a..ebe6c8c3061 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -211,7 +211,7 @@ Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode)
: i_mapEntry (sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode),
i_id(id), i_InstanceId(InstanceId), m_unloadTimer(0), i_gridExpiry(expiry),
m_activeNonPlayersIter(m_activeNonPlayers.end())
- , i_lock(false)
+ , i_lock(true)
{
for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
{
@@ -507,8 +507,7 @@ Map::Add(T *obj)
DEBUG_LOG("Object %u enters grid[%u,%u]", GUID_LOPART(obj->GetGUID()), cell.GridX(), cell.GridY());
- if(obj->GetTypeId() != TYPEID_UNIT)
- UpdateObjectVisibility(obj,cell,p);
+ UpdateObjectVisibility(obj,cell,p);
AddNotifier(obj);
}
@@ -610,19 +609,25 @@ bool Map::loaded(const GridPair &p) const
void Map::RelocationNotify()
{
- //creatures may be added to the list during update
- i_lock = true;
+ //Move backlog to notify list
+ for(std::vector<uint64>::iterator iter = i_unitsToNotifyBacklog.begin(); iter != i_unitsToNotifyBacklog.end(); ++iter)
+ {
+ if(Unit *unit = ObjectAccessor::GetObjectInWorld(*iter, (Unit*)NULL))
+ {
+ i_unitsToNotify.push_back(unit);
+ unit->m_Notified = false;
+ }
+ }
+ i_unitsToNotifyBacklog.clear();
//Notify
- for(std::vector<uint64>::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter)
+ for(std::vector<Unit*>::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter)
{
- Unit *unit = ObjectAccessor::GetObjectInWorld(*iter, (Unit*)NULL);
- if(!unit || !unit->IsInWorld() || unit->GetMapId() != GetId())
- {
- *iter = 0;
+ Unit *unit = *iter;
+ if(!unit->IsInWorld() || unit->GetMapId() != GetId())
continue;
- }
+ unit->m_IsInNotifyList = false;
unit->m_Notified = true;
if(unit->GetTypeId() == TYPEID_PLAYER)
@@ -637,23 +642,29 @@ void Map::RelocationNotify()
VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier);
}
}
+ i_unitsToNotify.clear();
+}
- //Clear list
- for(std::vector<uint64>::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter)
+void Map::AddUnitToNotify(Unit* u)
+{
+ if(u->m_IsInNotifyList)
+ return;
+
+ u->m_IsInNotifyList = true;
+
+ if(i_lock)
+ i_unitsToNotifyBacklog.push_back(u->GetGUID());
+ else
{
- if(Unit *unit = ObjectAccessor::GetObjectInWorld(*iter, (Unit*)NULL))
- {
- unit->m_IsInNotifyList = false;
- unit->m_Notified = false;
- }
+ i_unitsToNotify.push_back(u);
+ u->m_Notified = false;
}
- i_unitsToNotify.clear();
-
- i_lock = false;
}
void Map::Update(const uint32 &t_diff)
{
+ i_lock = false;
+
resetMarkedCells();
Trinity::ObjectUpdater updater(t_diff);
@@ -782,6 +793,8 @@ void Map::Update(const uint32 &t_diff)
}
}
+ i_lock = true;
+
RelocationNotify();
// Don't unload grids if it's battleground, since we may have manually added GOs,creatures, those doesn't load from DB at grid re-load !
@@ -2186,12 +2199,3 @@ void BattleGroundMap::UnloadAll()
/*--------------------------TRINITY-------------------------*/
-void Map::AddUnitToNotify(Unit* u)
-{
- if(!i_lock && !u->m_IsInNotifyList)
- {
- i_unitsToNotify.push_back(u->GetGUID());
- u->m_IsInNotifyList = true;
- }
-}
-
diff --git a/src/game/Map.h b/src/game/Map.h
index c5acedab174..82136a0cc7e 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -339,7 +339,8 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
time_t i_gridExpiry;
bool i_lock;
- std::vector<uint64> i_unitsToNotify;
+ std::vector<uint64> i_unitsToNotifyBacklog;
+ std::vector<Unit*> i_unitsToNotify;
std::set<WorldObject *> i_objectsToRemove;
std::map<WorldObject*, bool> i_objectsToSwitch;
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 764cb20c88c..6f78d95e079 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -17828,6 +17828,8 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<WorldObjec
#endif
}
}
+ else
+ SetToNotify();
}
/*template<>
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 900f060931f..50a8748329d 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -12810,6 +12810,9 @@ void Unit::RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo, Unit * cast
void Unit::SetToNotify()
{
+ if(m_IsInNotifyList)
+ return;
+
if(Map *map = GetMap())
map->AddUnitToNotify(this);
}