diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index 28f9e444aa..97f8d3f8e2 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -433,7 +433,7 @@
-
+
diff --git a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithDockedOverlay.cs
similarity index 86%
rename from OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs
rename to OpenRA.Mods.Common/Traits/Render/WithDockedOverlay.cs
index db95eec69f..65d9b730df 100644
--- a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs
+++ b/OpenRA.Mods.Common/Traits/Render/WithDockedOverlay.cs
@@ -15,7 +15,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Rendered when a harvester is docked.")]
- public class WithDockingOverlayInfo : ITraitInfo, Requires, Requires
+ public class WithDockedOverlayInfo : ITraitInfo, Requires, Requires
{
[Desc("Sequence name to use")]
[SequenceReference] public readonly string Sequence = "docking-overlay";
@@ -29,17 +29,17 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Custom palette is a player palette BaseName")]
public readonly bool IsPlayerPalette = false;
- public object Create(ActorInitializer init) { return new WithDockingOverlay(init.Self, this); }
+ public object Create(ActorInitializer init) { return new WithDockedOverlay(init.Self, this); }
}
- public class WithDockingOverlay : INotifyDocking, INotifyBuildComplete, INotifySold
+ public class WithDockedOverlay : INotifyDocking, INotifyBuildComplete, INotifySold
{
- readonly WithDockingOverlayInfo info;
+ readonly WithDockedOverlayInfo info;
readonly AnimationWithOffset anim;
bool buildComplete;
bool docked;
- public WithDockingOverlay(Actor self, WithDockingOverlayInfo info)
+ public WithDockedOverlay(Actor self, WithDockedOverlayInfo info)
{
this.info = info;
diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
index 41a8fd8377..1cac280126 100644
--- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
+++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
@@ -2876,6 +2876,13 @@ namespace OpenRA.Mods.Common.UtilityCommands
}
}
+ // Rename WithDockingOverlay to WithDockedOverlay
+ if (engineVersion < 20160116)
+ {
+ if (node.Key.StartsWith("WithDockingOverlay"))
+ node.Key = "WithDockedOverlay" + node.Key.Substring(18);
+ }
+
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}
diff --git a/OpenRA.Mods.TS/Activities/VoxelHarvesterDockSequence.cs b/OpenRA.Mods.TS/Activities/VoxelHarvesterDockSequence.cs
index c586124321..6c718fc8f4 100644
--- a/OpenRA.Mods.TS/Activities/VoxelHarvesterDockSequence.cs
+++ b/OpenRA.Mods.TS/Activities/VoxelHarvesterDockSequence.cs
@@ -10,6 +10,7 @@
using OpenRA.Activities;
using OpenRA.Mods.Common.Activities;
+using OpenRA.Mods.Common.Traits;
using OpenRA.Mods.TS.Traits;
namespace OpenRA.Mods.TS.Activities
@@ -17,24 +18,52 @@ namespace OpenRA.Mods.TS.Activities
public class VoxelHarvesterDockSequence : HarvesterDockSequence
{
readonly WithVoxelUnloadBody body;
+ readonly WithDockingOverlay spriteOverlay;
public VoxelHarvesterDockSequence(Actor self, Actor refinery, int dockAngle, bool isDragRequired, WVec dragOffset, int dragLength)
: base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength)
{
body = self.Trait();
+ spriteOverlay = refinery.TraitOrDefault();
}
public override Activity OnStateDock(Actor self)
{
body.Docked = true;
- dockingState = State.Loop;
+
+ if (spriteOverlay != null && !spriteOverlay.Visible)
+ {
+ spriteOverlay.Visible = true;
+ spriteOverlay.WithOffset.Animation.PlayThen(spriteOverlay.Info.Sequence, () => {
+ dockingState = State.Loop;
+ spriteOverlay.Visible = false;
+ });
+ }
+ else
+ dockingState = State.Loop;
+
return this;
}
public override Activity OnStateUndock(Actor self)
{
- body.Docked = false;
- dockingState = State.Complete;
+ dockingState = State.Wait;
+
+ if (spriteOverlay != null && !spriteOverlay.Visible)
+ {
+ spriteOverlay.Visible = true;
+ spriteOverlay.WithOffset.Animation.PlayBackwardsThen(spriteOverlay.Info.Sequence, () => {
+ dockingState = State.Complete;
+ body.Docked = false;
+ spriteOverlay.Visible = false;
+ });
+ }
+ else
+ {
+ dockingState = State.Complete;
+ body.Docked = false;
+ }
+
return this;
}
}
diff --git a/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj b/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj
index 0e35f2499b..26839244af 100644
--- a/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj
+++ b/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj
@@ -69,6 +69,7 @@
+
diff --git a/OpenRA.Mods.TS/Traits/Render/WithDockingOverlay.cs b/OpenRA.Mods.TS/Traits/Render/WithDockingOverlay.cs
new file mode 100644
index 0000000000..8a11e4818e
--- /dev/null
+++ b/OpenRA.Mods.TS/Traits/Render/WithDockingOverlay.cs
@@ -0,0 +1,59 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2015 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. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using OpenRA.Graphics;
+using OpenRA.Mods.Common.Traits;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.TS.Traits
+{
+ [Desc("Rendered on the refinery when a voxel harvester is docking and undocking.")]
+ public class WithDockingOverlayInfo : ITraitInfo, Requires, Requires
+ {
+ [Desc("Sequence name to use")]
+ [SequenceReference] public readonly string Sequence = "unload-overlay";
+
+ [Desc("Position relative to body")]
+ public readonly WVec Offset = WVec.Zero;
+
+ [Desc("Custom palette name")]
+ [PaletteReference("IsPlayerPalette")] public readonly string Palette = null;
+
+ [Desc("Custom palette is a player palette BaseName")]
+ public readonly bool IsPlayerPalette = false;
+
+ public object Create(ActorInitializer init) { return new WithDockingOverlay(init.Self, this); }
+ }
+
+ public class WithDockingOverlay
+ {
+ public readonly WithDockingOverlayInfo Info;
+ public readonly AnimationWithOffset WithOffset;
+
+ public bool Visible;
+
+ public WithDockingOverlay(Actor self, WithDockingOverlayInfo info)
+ {
+ Info = info;
+
+ var rs = self.Trait();
+ var body = self.Trait();
+
+ var overlay = new Animation(self.World, rs.GetImage(self));
+ overlay.Play(info.Sequence);
+
+ WithOffset = new AnimationWithOffset(overlay,
+ () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
+ () => !Visible);
+
+ rs.Add(WithOffset, info.Palette, info.IsPlayerPalette);
+ }
+ }
+}
\ No newline at end of file
diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml
index 1500b3a6ac..f6384d6a35 100644
--- a/mods/d2k/rules/structures.yaml
+++ b/mods/d2k/rules/structures.yaml
@@ -260,7 +260,7 @@ refinery:
FactionImages:
atreides: refinery.atreides
ordos: refinery.ordos
- WithDockingOverlay@SMOKE:
+ WithDockedOverlay@SMOKE:
Sequence: smoke
Power:
Amount: -75
diff --git a/mods/ts/rules/shared-structures.yaml b/mods/ts/rules/shared-structures.yaml
index f422326b5b..a95b7e5014 100644
--- a/mods/ts/rules/shared-structures.yaml
+++ b/mods/ts/rules/shared-structures.yaml
@@ -91,9 +91,10 @@ PROC:
Sequence: idle-redlights
WithIdleOverlay@BIB:
Sequence: bib
- WithDockingOverlay@flame:
+ WithDockedOverlay@FLAME:
Sequence: flame
Palette: effect
+ WithDockingOverlay@UNLOAD:
Power:
Amount: -30
ProvidesPrerequisite@buildingname:
diff --git a/mods/ts/sequences/structures.yaml b/mods/ts/sequences/structures.yaml
index 22bbce2af9..7953c39ac0 100644
--- a/mods/ts/sequences/structures.yaml
+++ b/mods/ts/sequences/structures.yaml
@@ -1038,7 +1038,6 @@ nahpad:
Offset: 0, 0
UseTilesetCode: false
-# TODO: unused narefn_a
proc.gdi:
Defaults: ntrefn
Offset: -12, -42
@@ -1057,6 +1056,9 @@ proc.gdi:
ShadowStart: 20
flame: ntrefn_b
Length: *
+ unload-overlay: narefn_a
+ Length: *
+ ZOffset: 1024
idle-redlights: ntrefn_c
Length: 16
Tick: 120
@@ -1078,7 +1080,6 @@ proc.gdi:
Offset: 0, 0
UseTilesetCode: false
-# TODO: unused narefn_a
proc.nod:
Defaults: ntrefn
Offset: -12, -42
@@ -1097,6 +1098,9 @@ proc.nod:
ShadowStart: 20
flame: ntrefn_b
Length: *
+ unload-overlay: narefn_a
+ Length: *
+ ZOffset: 1024
idle-redlights: ntrefn_c
Length: 16
Tick: 120