[11015] Prevent crash at player far teleport landing to nonexisten battleground instance.

Teleport back in like case or to homebind in bad case.
This commit is contained in:
VladimirMangos 2011-01-16 00:28:10 +03:00
parent 3de0f99f59
commit 0c19c2c6a2
4 changed files with 39 additions and 9 deletions

View file

@ -154,12 +154,14 @@ Map* MapManager::FindMap(uint32 mapid, uint32 instanceId) const
bool MapManager::CanPlayerEnter(uint32 mapid, Player* player) bool MapManager::CanPlayerEnter(uint32 mapid, Player* player)
{ {
const MapEntry *entry = sMapStore.LookupEntry(mapid); const MapEntry *entry = sMapStore.LookupEntry(mapid);
if(!entry) return false; if(!entry)
return false;
const char *mapName = entry->name[player->GetSession()->GetSessionDbcLocale()]; const char *mapName = entry->name[player->GetSession()->GetSessionDbcLocale()];
if(entry->map_type == MAP_INSTANCE || entry->map_type == MAP_RAID) if(entry->IsDungeon())
{ {
if (entry->map_type == MAP_RAID) if (entry->IsRaid())
{ {
// GMs can avoid raid limitations // GMs can avoid raid limitations
if(!player->isGameMaster() && !sWorld.getConfig(CONFIG_BOOL_INSTANCE_IGNORE_RAID)) if(!player->isGameMaster() && !sWorld.getConfig(CONFIG_BOOL_INSTANCE_IGNORE_RAID))
@ -228,10 +230,9 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player)
player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
return(false); return(false);
}*/ }*/
return true;
} }
else
return true; return true;
} }
void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId) void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId)

View file

@ -66,6 +66,32 @@ void WorldSession::HandleMoveWorldportAckOpcode()
// get the destination map entry, not the current one, this will fix homebind and reset greeting // get the destination map entry, not the current one, this will fix homebind and reset greeting
MapEntry const* mEntry = sMapStore.LookupEntry(loc.mapid); MapEntry const* mEntry = sMapStore.LookupEntry(loc.mapid);
Map* map = NULL;
// prevent crash at attempt landing to not existed battleground instance
if(mEntry->IsBattleGroundOrArena())
{
if (GetPlayer()->GetBattleGroundId())
map = sMapMgr.FindMap(loc.mapid, GetPlayer()->GetBattleGroundId());
if (!map)
{
DETAIL_LOG("WorldSession::HandleMoveWorldportAckOpcode: %s was teleported far to nonexisten battleground instance "
" (map:%u, x:%f, y:%f, z:%f) Trying to port him to his previous place..",
GetPlayer()->GetGuidStr().c_str(), loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z);
// Teleport to previous place, if cannot be ported back TP to homebind place
if (!GetPlayer()->TeleportTo(old_loc))
{
DETAIL_LOG("WorldSession::HandleMoveWorldportAckOpcode: %s cannot be ported to his previous place, teleporting him to his homebind place...",
GetPlayer()->GetGuidStr().c_str());
GetPlayer()->TeleportToHomebind();
}
return;
}
}
InstanceTemplate const* mInstance = ObjectMgr::GetInstanceTemplate(loc.mapid); InstanceTemplate const* mInstance = ObjectMgr::GetInstanceTemplate(loc.mapid);
// reset instance validity, except if going to an instance inside an instance // reset instance validity, except if going to an instance inside an instance
@ -75,7 +101,10 @@ void WorldSession::HandleMoveWorldportAckOpcode()
GetPlayer()->SetSemaphoreTeleportFar(false); GetPlayer()->SetSemaphoreTeleportFar(false);
// relocate the player to the teleport destination // relocate the player to the teleport destination
GetPlayer()->SetMap(sMapMgr.CreateMap(loc.mapid, GetPlayer())); if (!map)
map = sMapMgr.CreateMap(loc.mapid, GetPlayer());
GetPlayer()->SetMap(map);
GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation); GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation);
GetPlayer()->SendInitialPacketsBeforeAddToMap(); GetPlayer()->SendInitialPacketsBeforeAddToMap();

View file

@ -2756,7 +2756,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
if (totem && apply) if (totem && apply)
((Player*)target)->GetCamera().SetView(totem); ((Player*)target)->GetCamera().SetView(totem);
else else
((Player*)target)->GetCamera().ResetView(totem); ((Player*)target)->GetCamera().ResetView();
return; return;
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "11014" #define REVISION_NR "11015"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__