diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Corpse.cpp | 7 | ||||
-rw-r--r-- | src/game/Corpse.h | 7 | ||||
-rw-r--r-- | src/game/MapManager.cpp | 6 | ||||
-rw-r--r-- | src/game/MovementHandler.cpp | 10 | ||||
-rw-r--r-- | src/game/Object.h | 2 | ||||
-rw-r--r-- | src/game/ObjectAccessor.cpp | 4 | ||||
-rw-r--r-- | src/game/ObjectAccessor.h | 2 | ||||
-rw-r--r-- | src/game/ObjectMgr.cpp | 6 | ||||
-rw-r--r-- | src/game/Player.cpp | 4 |
9 files changed, 26 insertions, 22 deletions
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp index 31cfb700d4b..83d21bb3b14 100644 --- a/src/game/Corpse.cpp +++ b/src/game/Corpse.cpp @@ -182,7 +182,7 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId) return true; }*/ -bool Corpse::LoadFromDB(uint32 guid, Field *fields, uint32 & mapId, uint32 & instanceId) +bool Corpse::LoadFromDB(uint32 guid, Field *fields) { // 0 1 2 3 4 5 6 7 8 9 //result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance,phaseMask FROM corpse WHERE guid = '%u'",guid); @@ -199,9 +199,8 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields, uint32 & mapId, uint32 & in return false; } - mapId = fields[4].GetUInt32(); - SetMapId(mapId); - instanceId = fields[8].GetUInt32(); + SetMapId(fields[4].GetUInt32()); + SetInstanceId(fields[8].GetUInt32()); m_time = time_t(fields[6].GetUInt64()); m_type = CorpseType(fields[7].GetUInt32()); diff --git a/src/game/Corpse.h b/src/game/Corpse.h index 8e6b43b9d3d..ee6556e3436 100644 --- a/src/game/Corpse.h +++ b/src/game/Corpse.h @@ -62,15 +62,17 @@ class Corpse : public WorldObject void SaveToDB(); //bool LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId); - bool LoadFromDB(uint32 guid, Field *fields, uint32 & mapId, uint32 & instanceId); + bool LoadFromDB(uint32 guid, Field *fields); void DeleteBonesFromWorld(); void DeleteFromDB(); - void SetMap (Map * map) {WorldObject::SetMap(map); m_mapId = map->GetId();} + void SetMap (Map * map) {WorldObject::SetMap(map); m_mapId = map->GetId(); SetInstanceId(map->GetInstanceId());} // Used to check object existence in unloaded grids uint32 GetMapId() const {return m_mapId;} void SetMapId (uint32 id) {m_mapId = id;} + uint32 GetInstanceId() const {return m_instanceId;} + void SetInstanceId (uint32 id) {m_instanceId = id;} uint64 const& GetOwnerGUID() const { return GetUInt64Value(CORPSE_FIELD_OWNER); } @@ -101,6 +103,7 @@ class Corpse : public WorldObject time_t m_time; GridPair m_grid; // gride for corpse position for fast search uint32 m_mapId; // map id for fast corpse check at packet requests and in other situations with unloaded map of corpse. + uint32 m_instanceId; }; #endif diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index 1645419fd4d..74405462749 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -117,10 +117,14 @@ MapManager::_createBaseMap(uint32 id) { m = new MapInstanced(id, i_gridCleanUpDelay); } - else + else if (entry) { m = new Map(id, i_gridCleanUpDelay, 0, 0); } + else + { + assert(false); + } i_maps[id] = m; } diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 5ec73f9cb48..85514353152 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -66,8 +66,6 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->SetSemaphoreTeleportFar(false); - GetPlayer()->ResetMap(); - // relocate the player to the teleport destination Map * newMap = MapManager::Instance().CreateMap(loc.mapid, GetPlayer(), 0); // the CanEnter checks are done in TeleporTo but conditions may change @@ -75,19 +73,21 @@ void WorldSession::HandleMoveWorldportAckOpcode() if (!newMap || !newMap->CanEnter(GetPlayer())) { sLog.outError("Map %d could not be created for player %d, porting player to homebind", loc.mapid, GetPlayer()->GetGUIDLow()); - GetPlayer()->RelocateToHomebind(loc.mapid); - newMap = MapManager::Instance().CreateMap(loc.mapid, GetPlayer(), 0); + GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); + return; } else GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation); + GetPlayer()->ResetMap(); GetPlayer()->SetMap(newMap); GetPlayer()->SendInitialPacketsBeforeAddToMap(); if(!GetPlayer()->GetMap()->Add(GetPlayer())) { sLog.outError("WORLD: failed to teleport player %s (%d) to map %d because of unknown reason!", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), loc.mapid); - assert(false); + GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); + return; } // battleground state prepare (in case join to BG), at relogin/tele player not invited diff --git a/src/game/Object.h b/src/game/Object.h index 0e5bcd25a09..e8f9d9aafd7 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -440,7 +440,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object void GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z ) const; virtual uint32 GetMapId() const { return m_currMap ? m_currMap->GetId() : 0; } - uint32 GetInstanceId() const { return m_currMap ? m_currMap->GetInstanceId() : 0; } + virtual uint32 GetInstanceId() const { return m_currMap ? m_currMap->GetInstanceId() : 0; } virtual void SetPhaseMask(uint32 newPhaseMask, bool update); uint32 GetPhaseMask() const { return m_phaseMask; } diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp index b334ef8c5a8..cd58d564106 100644 --- a/src/game/ObjectAccessor.cpp +++ b/src/game/ObjectAccessor.cpp @@ -268,7 +268,7 @@ ObjectAccessor::RemoveCorpse(Corpse *corpse) } void -ObjectAccessor::AddCorpse(Corpse *corpse, uint32 mapId, uint32 instanceId) +ObjectAccessor::AddCorpse(Corpse *corpse) { assert(corpse && corpse->GetType() != CORPSE_BONES); @@ -280,7 +280,7 @@ ObjectAccessor::AddCorpse(Corpse *corpse, uint32 mapId, uint32 instanceId) CellPair cell_pair = Trinity::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord; - objmgr.AddCorpseCellData(mapId, cell_id, corpse->GetOwnerGUID(), instanceId); + objmgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID(), corpse->GetInstanceId()); } void diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h index 403470f9446..1941ccea30c 100644 --- a/src/game/ObjectAccessor.h +++ b/src/game/ObjectAccessor.h @@ -229,7 +229,7 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor, Corpse* GetCorpseForPlayerGUID(uint64 guid); void RemoveCorpse(Corpse *corpse); - void AddCorpse(Corpse *corpse, uint32 mapId, uint32 instanceId); + void AddCorpse(Corpse *corpse); void AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* map); Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index d249c60a175..7557c23d072 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -6483,16 +6483,14 @@ void ObjectMgr::LoadCorpses() uint32 guid = fields[result->GetFieldCount()-1].GetUInt32(); - uint32 mapId; - uint32 instanceId; Corpse *corpse = new Corpse; - if(!corpse->LoadFromDB(guid,fields,mapId,instanceId)) + if(!corpse->LoadFromDB(guid,fields)) { delete corpse; continue; } - ObjectAccessor::Instance().AddCorpse(corpse,mapId,instanceId); + ObjectAccessor::Instance().AddCorpse(corpse); ++count; } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 613181ead72..a319bf4317e 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4359,7 +4359,7 @@ void Player::CreateCorpse() corpse->SaveToDB(); // register for player, but not show - ObjectAccessor::Instance().AddCorpse(corpse, corpse->GetMapId(), corpse->GetInstanceId()); + ObjectAccessor::Instance().AddCorpse(corpse); } void Player::SpawnCorpseBones() @@ -19850,7 +19850,7 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const const WorldObject* player = GetCorpse(); if(!player || isAlive()) player = this; - + if(player->GetMapId() != pRewardSource->GetMapId() || player->GetInstanceId() != pRewardSource->GetInstanceId()) return false; |