Пример #1
0
            public override void OnRegister()
            {
                base.OnRegister();

                Expire = DateTime.UtcNow.AddSeconds(300.0);

                if (Effects == null)
                {
                    var effects = new EffectInfo[Area.Length][, ];

                    effects.SetAll(i => new EffectInfo[Area[i].Width, Area[i].Height]);

                    for (var index = 0; index < Area.Length; index++)
                    {
                        var b = Area[index];

                        var xSpacing = Math.Max(1, Math.Min(16, b.Width / 8));
                        var ySpacing = Math.Max(1, Math.Min(16, b.Height / 8));

                        var minX = Math.Min(b.Start.X, b.End.X);
                        var maxX = Math.Max(b.Start.X, b.End.X);

                        var minY = Math.Min(b.Start.Y, b.End.Y);
                        var maxY = Math.Max(b.Start.Y, b.End.Y);

                        Parallel.For(
                            minX,
                            maxX,
                            x => Parallel.For(
                                minY,
                                maxY,
                                y =>
                        {
                            if (x != b.Start.X && x != b.End.X - 1 && x % xSpacing != 0 &&                                          //
                                y != b.Start.Y && y != b.End.Y - 1 && y % ySpacing != 0)
                            {
                                return;
                            }

                            var idxX = x - minX;
                            var idxY = y - minY;

                            effects[index][idxX, idxY] = new EffectInfo(
                                new Point3D(x, y, 0),
                                Map,
                                EffectID,
                                EffectHue,
                                1,
                                25,
                                EffectRender);
                        }));
                    }

                    Effects = effects.SelectMany(list => list.OfType <EffectInfo>()).ToArray();

                    foreach (var e in Effects)
                    {
                        e.SetSource(e.Source.ToPoint3D(e.Source.GetAverageZ(e.Map)));
                    }
                }

                if (Timer == null)
                {
                    Timer = PollTimer.FromSeconds(
                        1.0,
                        () =>
                    {
                        if (DateTime.UtcNow > Expire)
                        {
                            Unregister();
                            return;
                        }

                        foreach (var e in Effects)
                        {
                            e.Send();
                        }
                    },
                        () => Registered);
                }
                else
                {
                    Timer.Running = true;
                }

                _Previews.AddOrReplace(Serial, this);
            }