diff options
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r-- | src/server/game/Groups/Group.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 24bc91aad16..b46fe069cfb 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -2172,7 +2172,41 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo) { // do not reset the instance, just unbind if others are permanently bound to it if (isEmpty && instanceSave->CanReset()) + { + if (map && this->isRaidGroup() && map->IsDungeon() && SendMsgTo) + { + AreaTrigger const * const instanceEntrance = sObjectMgr->GetGoBackTrigger(map->GetId()); + + if (!instanceEntrance) + TC_LOG_DEBUG("root", "Instance entrance not found for maps %u", map->GetId()); + else + { + WorldSafeLocsEntry const * graveyardLocation = sObjectMgr->GetClosestGraveyard(instanceEntrance->target_X, instanceEntrance->target_Y, instanceEntrance->target_Z, instanceEntrance->target_mapId, SendMsgTo->GetTeam());; + uint32 const zoneId = sMapMgr->GetZoneId(graveyardLocation->map_id, graveyardLocation->x, graveyardLocation->y, graveyardLocation->z); + + for (const MemberSlot &member : this->GetMemberSlots()) + { + if (!ObjectAccessor::FindConnectedPlayer(member.guid)) + { + PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_POSITION_BY_MAPID); + + stmt->setFloat(0, graveyardLocation->x); + stmt->setFloat(1, graveyardLocation->y); + stmt->setFloat(2, graveyardLocation->z); + stmt->setFloat(3, instanceEntrance->target_Orientation); + stmt->setUInt32(4, graveyardLocation->map_id); + stmt->setUInt32(5, zoneId); + stmt->setUInt32(6, member.guid); + stmt->setUInt32(7, map->GetId()); + + CharacterDatabase.Execute(stmt); + } + } + } + } + instanceSave->DeleteFromDB(); + } else { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE); |