diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/GridNotifiers.cpp | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/game/GridNotifiers.cpp')
-rw-r--r-- | src/game/GridNotifiers.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp index 9673db24732..11cbb741e45 100644 --- a/src/game/GridNotifiers.cpp +++ b/src/game/GridNotifiers.cpp @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "GridNotifiers.h" #include "WorldPacket.h" #include "WorldSession.h" @@ -25,7 +26,9 @@ #include "Map.h" #include "Transports.h" #include "ObjectAccessor.h" + using namespace Trinity; + void VisibleChangesNotifier::Visit(PlayerMapType &m) { @@ -33,7 +36,9 @@ VisibleChangesNotifier::Visit(PlayerMapType &m) { if(iter->getSource() == &i_object) continue; + iter->getSource()->UpdateVisibilityOf(&i_object); + if(!iter->getSource()->GetSharedVisionList().empty()) for(SharedVisionList::const_iterator i = iter->getSource()->GetSharedVisionList().begin(); i != iter->getSource()->GetSharedVisionList().end(); ++i) @@ -41,6 +46,7 @@ VisibleChangesNotifier::Visit(PlayerMapType &m) (*i)->UpdateVisibilityOf(&i_object); } } + void VisibleChangesNotifier::Visit(CreatureMapType &m) { @@ -51,6 +57,7 @@ VisibleChangesNotifier::Visit(CreatureMapType &m) if((*i)->m_seer == iter->getSource()) (*i)->UpdateVisibilityOf(&i_object); } + void VisibleChangesNotifier::Visit(DynamicObjectMapType &m) { @@ -60,6 +67,7 @@ VisibleChangesNotifier::Visit(DynamicObjectMapType &m) if(caster->m_seer == iter->getSource()) caster->UpdateVisibilityOf(&i_object); } + void PlayerVisibilityNotifier::Notify() { @@ -77,16 +85,19 @@ PlayerVisibilityNotifier::Notify() } } } + // generate outOfRange for not iterate objects i_data.AddOutOfRangeGUID(i_clientGUIDs); for(Player::ClientGUIDs::iterator itr = i_clientGUIDs.begin();itr!=i_clientGUIDs.end();++itr) { i_player.m_clientGUIDs.erase(*itr); + #ifdef TRINITY_DEBUG if((sLog.getLogFilter() & LOG_FILTER_VISIBILITY_CHANGES)==0) sLog.outDebug("Object %u (Type: %u) is out of range (no in active cells set) now for player %u",GUID_LOPART(*itr),GuidHigh2TypeId(GUID_HIPART(*itr)),i_player.GetGUIDLow()); #endif } + if( i_data.HasData() ) { /*uint32 entry = 0, map; @@ -99,30 +110,37 @@ PlayerVisibilityNotifier::Notify() y = (*i_visibleNow.begin())->GetPositionY(); sLog.outError("notify %u %u %f %f", entry, map, x, y); }*/ + // send create/outofrange packet to player (except player create updates that already sent using SendUpdateToPlayer) WorldPacket packet; i_data.BuildPacket(&packet); i_player.GetSession()->SendPacket(&packet); + // send out of range to other players if need std::set<uint64> const& oor = i_data.GetOutOfRangeGUIDs(); for(std::set<uint64>::const_iterator iter = oor.begin(); iter != oor.end(); ++iter) { if(!IS_PLAYER_GUID(*iter)) continue; + Player* plr = ObjectAccessor::GetPlayer(i_player,*iter); if(plr) plr->UpdateVisibilityOf(&i_player); } } + // Now do operations that required done at object visibility change to visible + // send data at target visibility change (adding to client) for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr) // target aura duration for caster show only if target exist at caster client if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT)) i_player.SendInitialVisiblePackets((Unit*)(*vItr)); + if(i_visibleNow.size() >= 30) i_player.SetToNotify(); } + void MessageDistDeliverer::Visit(PlayerMapType &m) { @@ -131,8 +149,10 @@ MessageDistDeliverer::Visit(PlayerMapType &m) Player *target = iter->getSource(); if(!target->InSamePhase(i_phaseMask)) continue; + if(target->GetExactDistSq(i_source) > i_distSq) continue; + // Send packet to all who are sharing the player's vision if (!target->GetSharedVisionList().empty()) { @@ -141,10 +161,12 @@ MessageDistDeliverer::Visit(PlayerMapType &m) if((*i)->m_seer == target) SendPacket(*i); } + if(target->m_seer == target || target->GetVehicle()) SendPacket(target); } } + void MessageDistDeliverer::Visit(CreatureMapType &m) { @@ -152,8 +174,10 @@ MessageDistDeliverer::Visit(CreatureMapType &m) { if(!iter->getSource()->InSamePhase(i_phaseMask)) continue; + if(iter->getSource()->GetExactDistSq(i_source) > i_distSq) continue; + // Send packet to all who are sharing the creature's vision if (!iter->getSource()->GetSharedVisionList().empty()) { @@ -164,6 +188,7 @@ MessageDistDeliverer::Visit(CreatureMapType &m) } } } + void MessageDistDeliverer::Visit(DynamicObjectMapType &m) { @@ -171,8 +196,10 @@ MessageDistDeliverer::Visit(DynamicObjectMapType &m) { if(!iter->getSource()->InSamePhase(i_phaseMask)) continue; + if(iter->getSource()->GetExactDistSq(i_source) > i_distSq) continue; + if (IS_PLAYER_GUID(iter->getSource()->GetCasterGUID())) { // Send packet back to the caster if the caster has vision of dynamic object @@ -182,6 +209,7 @@ MessageDistDeliverer::Visit(DynamicObjectMapType &m) } } } + /* void MessageDistDeliverer::VisitObject(Player* plr) @@ -192,6 +220,7 @@ MessageDistDeliverer::VisitObject(Player* plr) } } */ + template<class T> void ObjectUpdater::Visit(GridRefManager<T> &m) { @@ -201,17 +230,23 @@ ObjectUpdater::Visit(GridRefManager<T> &m) iter->getSource()->Update(i_timeDiff); } } + bool CannibalizeObjectCheck::operator()(Corpse* u) { // ignore bones if(u->GetType()==CORPSE_BONES) return false; + Player* owner = ObjectAccessor::FindPlayer(u->GetOwnerGUID()); + if( !owner || i_funit->IsFriendlyTo(owner)) return false; + if(i_funit->IsWithinDistInMap(u, i_range) ) return true; + return false; } + template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &); template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &); |