// Both partly public void ChangeMap(long id, short?mapId = null, short?mapX = null, short?mapY = null) { ClientSession session = GetSessionByCharacterId(id); if (session != null && session.Character != null && !session.Character.IsChangingMap) { try { session.Character.IsChangingMap = true; session.CurrentMap.RemoveMonstersTarget(session.Character.CharacterId); session.CurrentMap.UnregisterSession(session.Character.CharacterId); // cleanup sending queue to avoid sending uneccessary packets to it session.ClearLowPriorityQueue(); // avoid cleaning new portals if (mapId != null || mapX != null || mapY != null) { session.Character.MapId = (short)mapId; session.Character.MapX = (short)mapX; session.Character.MapY = (short)mapY; } session.CurrentMap = GetMap(session.Character.MapId); session.CurrentMap.RegisterSession(session); session.SendPacket(session.Character.GenerateCInfo()); session.SendPacket(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.SendPacket(session.Character.GenerateLev()); session.SendPacket(session.Character.GenerateStat()); session.SendPacket(session.Character.GenerateAt()); session.SendPacket(session.Character.GenerateCond()); session.SendPacket(session.Character.GenerateCMap()); session.SendPacket(session.Character.GenerateStatChar()); session.SendPacket($"gidx 1 {session.Character.CharacterId} -1 - 0"); // family session.SendPacket("rsfp 0 -1"); // in 2 // send only when partner present cond 2 // send only when partner present session.SendPacket(session.Character.GeneratePairy()); session.SendPacket("pinit 0"); // clear party list session.SendPacket("act6"); // act6 1 0 14 0 0 0 14 0 0 0 Sessions.Where(s => s.Character != null && s.Character.MapId.Equals(session.Character.MapId) && s.Character.Name != session.Character.Name && !s.Character.InvisibleGm).ToList().ForEach(s => RequireBroadcastFromUser(session, s.Character.CharacterId, "GenerateIn")); session.SendPackets(session.Character.GenerateGp()); // wp 23 124 4 4 12 99 session.SendPackets(session.Character.GenerateIn3()); session.SendPackets(session.Character.GenerateIn2()); session.SendPackets(session.Character.GenerateNPCShopOnMap()); session.SendPackets(session.Character.GenerateDroppedItem()); session.SendPackets(session.Character.GenerateShopOnMap()); session.SendPackets(session.Character.GeneratePlayerShopOnMap()); if (mapId == 138) { session.SendPacket("bc 0 0 0"); } if (!session.Character.InvisibleGm) { session.CurrentMap?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); } if (session.Character.Size != 10) { session.SendPacket(session.Character.GenerateScal()); } if (session.CurrentMap.IsDancing && !session.Character.IsDancing) { session.CurrentMap?.Broadcast("dance 2"); } else if (!session.CurrentMap.IsDancing && session.Character.IsDancing) { session.Character.IsDancing = false; session.CurrentMap?.Broadcast("dance"); } foreach (Group g in Groups) { foreach (ClientSession groupSession in g.Characters) { ClientSession chara = Sessions.FirstOrDefault(s => s.Character != null && s.Character.CharacterId == groupSession.Character.CharacterId && s.CurrentMap.MapId == groupSession.CurrentMap.MapId); if (chara != null) { groupSession.SendPacket(groupSession.Character.GeneratePinit()); } if (groupSession.Character.CharacterId == groupSession.Character.CharacterId) { session.CurrentMap?.Broadcast(groupSession, groupSession.Character.GeneratePidx(), ReceiverType.AllExceptMe); } } } session.Character.IsChangingMap = false; } catch (Exception) { Logger.Log.Warn("Character changed while changing map. Do not abuse Commands."); session.Character.IsChangingMap = false; } } }