private void UpdateLaserQueue()
        {
            if (laserbeamPaq.Count > DetectionDelay)
            {
                List <Laserbeam> laserbeams = laserbeamPaq.Peek(DetectionDelay);
                OnLaserbeams(laserbeams);
                HashSet <Laserbeam> handledThisUpdate = new HashSet <Laserbeam>();

                foreach (Laserbeam beam in laserbeams)
                {
                    if (!handledBeams.Contains(beam))
                    {
                        handledBeams.Add(beam);
                        OnNewLaserbeam(beam);
                    }

                    handledThisUpdate.Add(beam);
                }

                foreach (Laserbeam beam in handledBeams.Except(handledThisUpdate).ToArray())
                {
                    handledBeams.Remove(beam);
                    OnDeadLaserbeam(beam);
                }
            }

            laserbeamPaq.Enqueue(LaserHelper.ConnectedLasers(Scene, this));
        }
        private void reflect(Laserbeam beam)
        {
            if (!reflections.ContainsKey(beam))
            {
                Level  level        = Scene as Level;
                string newDirection = LaserHelper.GetReflection(opening, beam);

                if (newDirection != null)
                {
                    reflections[beam] = new Laserbeam(Position, newDirection, beam.Color, beam.TTL);
                    level.Add(reflections[beam]);
                    reflections[beam].Depth     = beam.Depth + 1;
                    reflections[beam].Position += reflectionOffsets[newDirection];
                }
            }
        }
        public static void SetLaserLengthDAQ(Scene scene, Laserbeam beam)
        {
            Level level     = scene as Level;
            float maxLength = LaserHelper.MaxBeamLength(level, beam);

            float offset = maxLength / 2f;

            beam.Length = offset;

            while (offset >= 1f)
            {
                bool colliding = beam.CollideCheck <Solid>() || LaserHelper.LaserBlockingCheck(scene, beam);
                int  sign      = colliding ? -1 : 1;

                offset      /= 2f;
                beam.Length += sign * offset;
            }

            beam.Length = (float)Math.Round(beam.Length);
        }