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 (int index = 0; index < Area.Length; index++) { var b = Area[index]; int xSpacing = Math.Max(1, Math.Min(16, b.Width / 8)); int ySpacing = Math.Max(1, Math.Min(16, b.Height / 8)); int minX = Math.Min(b.Start.X, b.End.X); int maxX = Math.Max(b.Start.X, b.End.X); int minY = Math.Min(b.Start.Y, b.End.Y); int 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; } int idxX = x - minX; int idxY = y - minY; effects[index][idxX, idxY] = new EffectInfo( new Point3D(x, y, 0), Map, EffectID, EffectHue, 1, 25, EffectRender); })); } Effects = effects.AsParallel().SelectMany(list => list.OfType <EffectInfo>()).ToArray(); foreach (var e in Effects) { e.SetSource(e.Source.GetWorldTop(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); }