diff options
Diffstat (limited to 'src/game/ObjectMgr.cpp')
-rw-r--r-- | src/game/ObjectMgr.cpp | 85 |
1 files changed, 59 insertions, 26 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 446971968e0..43d867d779d 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -4827,12 +4827,6 @@ void ObjectMgr::LoadGraveyardZones() continue; } - if(entry->map_id != areaEntry->mapid && team != 0) - { - sLog.outErrorDb("Table `game_graveyard_zone` has record for ghost zone (%u) at map %u and graveyard (%u) at map %u for team %u, but in case maps are different, player faction setting is ignored. Use faction 0 instead.",zoneId,areaEntry->mapid, safeLocId, entry->map_id, team); - team = 0; - } - if(!AddGraveYardLink(safeLocId,zoneId,team,false)) sLog.outErrorDb("Table `game_graveyard_zone` has a duplicate record for Graveyard (ID: %u) and Zone (ID: %u), skipped.",safeLocId,zoneId); } while( result->NextRow() ); @@ -4854,7 +4848,7 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float // if mapId == graveyard.mapId (ghost in plain zone or city or battleground) and search graveyard at same map // then check faction // if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated - // then skip check faction + // then check faction GraveYardMap::const_iterator graveLow = mGraveYardMap.lower_bound(zoneId); GraveYardMap::const_iterator graveUp = mGraveYardMap.upper_bound(zoneId); if(graveLow==graveUp) @@ -4863,11 +4857,21 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float return NULL; } + // at corpse map bool foundNear = false; float distNear; WorldSafeLocsEntry const* entryNear = NULL; + + // at entrance map for corpse map + bool foundEntr = false; + float distEntr; + WorldSafeLocsEntry const* entryEntr = NULL; + + // some where other WorldSafeLocsEntry const* entryFar = NULL; + MapEntry const* mapEntry = sMapStore.LookupEntry(MapId); + for(GraveYardMap::const_iterator itr = graveLow; itr != graveUp; ++itr) { GraveYardData const& data = itr->second; @@ -4879,40 +4883,69 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float continue; } - // remember first graveyard at another map and ignore other - if(MapId != entry->map_id) - { - if(!entryFar) - entryFar = entry; - continue; - } - - // skip enemy faction graveyard at same map (normal area, city, or battleground) + // skip enemy faction graveyard // team == 0 case can be at call from .neargrave if(data.team != 0 && team != 0 && data.team != team) continue; - // find now nearest graveyard at same map - float dist2 = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y)+(entry->z - z)*(entry->z - z); - if(foundNear) + // find now nearest graveyard at other map + if(MapId != entry->map_id) { - if(dist2 < distNear) + // if find graveyard at different map from where entrance placed (or no entrance data), use any first + if (!mapEntry || mapEntry->entrance_map < 0 || mapEntry->entrance_map != entry->map_id || + mapEntry->entrance_x == 0 && mapEntry->entrance_y == 0) { - distNear = dist2; - entryNear = entry; + // not have any corrdinates for check distance anyway + entryFar = entry; + continue; + } + + // at entrance map calculate distance (2D); + float dist2 = (entry->x - mapEntry->entrance_x)*(entry->x - mapEntry->entrance_x) + +(entry->y - mapEntry->entrance_y)*(entry->y - mapEntry->entrance_y); + if(foundEntr) + { + if(dist2 < distEntr) + { + distEntr = dist2; + entryEntr = entry; + } + } + else + { + foundEntr = true; + distEntr = dist2; + entryEntr = entry; } } + // find now nearest graveyard at same map else { - foundNear = true; - distNear = dist2; - entryNear = entry; + float dist2 = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y)+(entry->z - z)*(entry->z - z); + if(foundNear) + { + if(dist2 < distNear) + { + distNear = dist2; + entryNear = entry; + } + } + else + { + foundNear = true; + distNear = dist2; + entryNear = entry; + } } } + // find now nearest graveyard at same map if(entryNear) return entryNear; + if(entryEntr) + return entryEntr; + return entryFar; } @@ -5131,7 +5164,7 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const if(!mapEntry) return NULL; for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); itr++) { - if(itr->second.target_mapId == mapEntry->parent_map) + if(itr->second.target_mapId == mapEntry->entrance_map) { AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first); if(atEntry && atEntry->mapid == Map) |