aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-05-15 00:08:40 +0200
committerShauren <shauren.trinity@gmail.com>2015-05-15 00:08:40 +0200
commit18e4ab6911468b829b0fc768e532a770263c3717 (patch)
tree7f93313a83a8e03037a35355c92282e5d3bf1e5f /src
parent05dab7e1e2491fa64dc460bcb67021d2207e6ba7 (diff)
Core/Maps: Fixed crash in Map::SendObjectUpdates - items were not properly removed from Map::_updateObjects because player was removed from world first
Closes #14673
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Maps/Map.cpp2
4 files changed, 7 insertions, 9 deletions
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 4294eb57dbd..15e560a8e7e 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -59,7 +59,7 @@ void Corpse::RemoveFromWorld()
if (IsInWorld())
GetMap()->GetObjectsStore().Remove<Corpse>(GetGUID());
- Object::RemoveFromWorld();
+ WorldObject::RemoveFromWorld();
}
bool Corpse::Create(ObjectGuid::LowType guidlow, Map* map)
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 109b1a53657..a3a602d2f4a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2315,17 +2315,16 @@ void Player::RemoveFromWorld()
sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
}
+ // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
+ for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
+ if (m_items[i])
+ m_items[i]->RemoveFromWorld();
+
///- Do not add/remove the player from the object storage
///- It will crash when updating the ObjectAccessor
///- The player should only be removed when logging out
Unit::RemoveFromWorld();
- for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
- {
- if (m_items[i])
- m_items[i]->RemoveFromWorld();
- }
-
for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
iter->second->RemoveFromWorld();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index eeb5a118adc..df08a1b30d4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1325,7 +1325,6 @@ private:
PlayerTalentInfo(PlayerTalentInfo const&);
};
-
class Player : public Unit, public GridObject<Player>
{
friend class WorldSession;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 108b7cadfe1..26a3d38635d 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2600,7 +2600,7 @@ void Map::SendObjectUpdates()
while (!_updateObjects.empty())
{
Object* obj = *_updateObjects.begin();
- ASSERT(obj && obj->IsInWorld());
+ ASSERT(obj->IsInWorld());
_updateObjects.erase(_updateObjects.begin());
obj->BuildUpdate(update_players);
}