diff --git a/OpenRA.Mods.Common/Effects/MapNotificationEffect.cs b/OpenRA.Mods.Common/Effects/MapNotificationEffect.cs new file mode 100644 index 0000000000..78f142b9df --- /dev/null +++ b/OpenRA.Mods.Common/Effects/MapNotificationEffect.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using OpenRA.Effects; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Effects +{ + public class MapNotificationEffect : IEffect + { + readonly RadarPings radarPings; + + readonly WPos pos; + readonly Player player; + readonly int duration; + readonly string category; + readonly string notification; + readonly bool visible; + readonly Color color; + + int remainingDelay; + + public MapNotificationEffect(Player player, string category, string notification, int delay, + bool pingVisible, WPos pos, Color pingColor, int pingDuration = 50) + { + this.player = player; + remainingDelay = delay; + this.category = category; + this.notification = notification; + this.pos = pos; + duration = pingDuration; + visible = pingVisible; + color = pingColor; + + radarPings = player.World.WorldActor.TraitOrDefault(); + } + + public void Tick(World world) + { + if (remainingDelay-- > 0) + return; + + Game.Sound.PlayNotification(player.World.Map.Rules, player, category, notification, player.Faction.InternalName); + + if (visible && radarPings != null && player == player.World.RenderPlayer) + radarPings.Add(() => true, pos, color, duration); + + world.AddFrameEndTask(w => w.Remove(this)); + } + + public IEnumerable Render(WorldRenderer wr) { return SpriteRenderable.None; } + } +} diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index f29d2ca8ce..770fd27890 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -141,6 +141,7 @@ + diff --git a/OpenRA.Mods.D2k/Activities/SwallowActor.cs b/OpenRA.Mods.D2k/Activities/SwallowActor.cs index dfa184b958..e3afa8aa45 100644 --- a/OpenRA.Mods.D2k/Activities/SwallowActor.cs +++ b/OpenRA.Mods.D2k/Activities/SwallowActor.cs @@ -14,6 +14,7 @@ using System.Drawing; using System.Linq; using OpenRA.Activities; using OpenRA.GameRules; +using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits; using OpenRA.Mods.D2k.Traits; using OpenRA.Traits; @@ -30,7 +31,6 @@ namespace OpenRA.Mods.D2k.Activities readonly Sandworm sandworm; readonly ConditionManager conditionManager; readonly WeaponInfo weapon; - readonly RadarPings radarPings; readonly AttackSwallow swallow; readonly IPositionable positionable; @@ -47,7 +47,6 @@ namespace OpenRA.Mods.D2k.Activities positionable = self.Trait(); swallow = self.Trait(); conditionManager = self.TraitOrDefault(); - radarPings = self.World.WorldActor.TraitOrDefault(); } bool AttackTargets(Actor self, IEnumerable targets) @@ -78,19 +77,8 @@ namespace OpenRA.Mods.D2k.Activities var affectedPlayers = targets.Select(x => x.Owner).Distinct().ToList(); Game.Sound.Play(SoundType.World, swallow.Info.WormAttackSound, self.CenterPosition); - Game.RunAfterDelay(1000, () => - { - if (!Game.IsCurrentWorld(self.World)) - return; - - foreach (var player in affectedPlayers) - { - Game.Sound.PlayNotification(player.World.Map.Rules, player, "Speech", swallow.Info.WormAttackNotification, player.Faction.InternalName); - - if (player == player.World.RenderPlayer) - radarPings.Add(() => true, attackPosition, Color.Red, 50); - } - }); + foreach (var player in affectedPlayers) + self.World.AddFrameEndTask(w => w.Add(new MapNotificationEffect(player, "Speech", swallow.Info.WormAttackNotification, 25, true, attackPosition, Color.Red))); foreach (var notify in self.TraitsImplementing()) {