public void Update(ITerrain terrain, Player player, Area visibleArea)
            {
                if (IsEmpty)
                {
                    return;
                }

                if (!visibleArea.IntersectsWith(BoundingBox))
                {
                    // nem lathato cella
                    if (Updates.Count <= 0)
                    {
                        return;
                    }

                    // ha van benne update akkor csak a tipust tartjuk meg es az osszes update-et toroljuk
                    DirtyLayers.AddMany(Updates.Select(u => u.Type).Distinct());
                    Updates.Clear();
                    return;
                }

                if (DirtyLayers.Count > 0)
                {
                    // itt az egesz cellat elkuldjuk ha valamelyik tipus modosult
                    foreach (var type in DirtyLayers)
                    {
                        var packet = terrain.BuildLayerUpdatePacket(type, BoundingBox);
                        player.Session.SendPacket(packet);
                    }

                    //torlunk mindent
                    Updates.Clear();
                    DirtyLayers.Clear();
                    return;
                }

                // itt a kis teruleteket vizsgaljuk meg,h lathato-e
                // ha igen akkor kikuldjuk es toroljuk a cellabol
                Updates.RemoveAll(info =>
                {
                    if (!info.IntersectsWith(visibleArea))
                    {
                        return(false);
                    }

                    var packet = info.CreateUpdatePacket(terrain);
                    player.Session.SendPacket(packet);
                    return(true);
                });
            }
 public override Packet CreateUpdatePacket(ITerrain terrain)
 {
     return(terrain.BuildLayerUpdatePacket(Type, new Area(Position.X, Position.Y, Position.X, Position.Y)));
 }
        public override Packet CreateUpdatePacket(ITerrain terrain)
        {
            var packet = terrain.BuildLayerUpdatePacket(Type, Area);

            return(packet);
        }