diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index f2301065d..f396df99a 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -528,6 +528,7 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?"); PrepareStatement(CharStatements.UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?"); PrepareStatement(CharStatements.UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ?"); + PrepareStatement(CharStatements.UPD_CHARACTER_POSITION_BY_MAPID, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ? AND map = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454"); PrepareStatement(CharStatements.SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0"); PrepareStatement(CharStatements.SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?"); @@ -1191,6 +1192,7 @@ namespace Framework.Database DEL_CHARACTER_SOCIAL, UPD_CHARACTER_SOCIAL_NOTE, UPD_CHARACTER_POSITION, + UPD_CHARACTER_POSITION_BY_MAPID, INS_LFG_DATA, DEL_LFG_DATA, diff --git a/Source/Game/Groups/Group.cs b/Source/Game/Groups/Group.cs index b5f9fda4a..679e94f97 100644 --- a/Source/Game/Groups/Group.cs +++ b/Source/Game/Groups/Group.cs @@ -2035,7 +2035,43 @@ namespace Game.Groups { // do not reset the instance, just unbind if others are permanently bound to it if (instanceSave.CanReset()) + { + if (map != null && IsRaidGroup() && map.IsDungeon() && SendMsgTo) + { + AreaTriggerStruct instanceEntrance = Global.ObjectMgr.GetGoBackTrigger(map.GetId()); + + if (instanceEntrance == null) + Log.outDebug(LogFilter.Misc, $"Instance entrance not found for map {map.GetId()}"); + else + { + WorldSafeLocsEntry graveyardLocation = Global.ObjectMgr.GetClosestGraveYard( + new WorldLocation(instanceEntrance.target_mapId, instanceEntrance.target_X, instanceEntrance.target_Y, instanceEntrance.target_Z), + SendMsgTo.GetTeam(), null); + uint zoneId = Global.MapMgr.GetZoneId(PhasingHandler.EmptyPhaseShift, graveyardLocation.Loc.GetMapId(), + graveyardLocation.Loc.GetPositionX(), graveyardLocation.Loc.GetPositionY(), graveyardLocation.Loc.GetPositionZ()); + + foreach (MemberSlot member in GetMemberSlots()) + { + if (!Global.ObjAccessor.FindConnectedPlayer(member.guid)) + { + var stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHARACTER_POSITION_BY_MAPID); + + stmt.AddValue(0, graveyardLocation.Loc.GetPositionX()); + stmt.AddValue(1, graveyardLocation.Loc.GetPositionY()); + stmt.AddValue(2, graveyardLocation.Loc.GetPositionZ()); + stmt.AddValue(3, instanceEntrance.target_Orientation); + stmt.AddValue(4, graveyardLocation.Loc.GetMapId()); + stmt.AddValue(5, zoneId); + stmt.AddValue(6, member.guid.GetCounter()); + stmt.AddValue(7, map.GetId()); + + DB.Characters.Execute(stmt); + } + } + } + } instanceSave.DeleteFromDB(); + } else { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GROUP_INSTANCE_BY_INSTANCE);