diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 4ee2c5f1d8..cc99b3e14d 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -317,7 +317,6 @@
-
@@ -423,6 +422,7 @@
+
diff --git a/OpenRA.Mods.RA/Render/RenderUnitSpinner.cs b/OpenRA.Mods.RA/Render/RenderUnitSpinner.cs
deleted file mode 100755
index 9665c224e1..0000000000
--- a/OpenRA.Mods.RA/Render/RenderUnitSpinner.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-#region Copyright & License Information
-/*
- * Copyright 2007-2011 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.Traits;
-
-namespace OpenRA.Mods.RA.Render
-{
- class RenderUnitSpinnerInfo : RenderUnitInfo
- {
- public readonly int[] Offset = { 0, 0 };
- public override object Create(ActorInitializer init) { return new RenderUnitSpinner(init.self); }
- }
-
- class RenderUnitSpinner : RenderUnit
- {
- public RenderUnitSpinner(Actor self)
- : base(self)
- {
- var info = self.Info.Traits.Get();
-
- var spinnerAnim = new Animation(GetImage(self));
- var facing = self.Trait();
-
- spinnerAnim.PlayRepeating("spinner");
-
- var turret = new Turret(info.Offset);
- anims.Add("spinner", new AnimationWithOffset(
- spinnerAnim,
- wr => turret.PxPosition(self, facing).ToFloat2(),
- null ) { ZOffset = 1 } );
- }
- }
-}
diff --git a/OpenRA.Mods.RA/Render/WithSpinner.cs b/OpenRA.Mods.RA/Render/WithSpinner.cs
new file mode 100755
index 0000000000..4b98452759
--- /dev/null
+++ b/OpenRA.Mods.RA/Render/WithSpinner.cs
@@ -0,0 +1,39 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2011 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.FileFormats;
+using OpenRA.Graphics;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Render
+{
+ class WithSpinnerInfo : ITraitInfo, Requires
+ {
+ public readonly string Name = "spinner";
+ [Desc("Position relative to body")]
+ public readonly WVec Offset = WVec.Zero;
+
+ public object Create(ActorInitializer init) { return new WithSpinner(init.self, this); }
+ }
+
+ class WithSpinner
+ {
+ public WithSpinner(Actor self, WithSpinnerInfo info)
+ {
+ var rs = self.Trait();
+ var spinner = new Animation(rs.GetImage(self));
+ spinner.PlayRepeating("spinner");
+ rs.anims.Add(info.Name, new AnimationWithOffset(
+ spinner,
+ wr => wr.ScreenPxOffset(rs.LocalToWorld(info.Offset.Rotate(rs.QuantizeOrientation(self, self.Orientation)))),
+ null ) { ZOffset = 1 } );
+ }
+ }
+}
diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml
index c79d1e2e82..dbed910aba 100644
--- a/mods/cnc/rules/vehicles.yaml
+++ b/mods/cnc/rules/vehicles.yaml
@@ -564,8 +564,9 @@ MHQ:
Speed: 6
RevealsShroud:
Range: 6
- RenderUnitSpinner:
- Offset: 0,6
+ RenderUnit:
+ WithSpinner:
+ Offset: -256,0,256
AttackMove:
JustMove: yes
Explodes:
diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml
index 266fe43b34..cdde0e078b 100644
--- a/mods/ra/rules/vehicles.yaml
+++ b/mods/ra/rules/vehicles.yaml
@@ -501,8 +501,9 @@ MGG:
Speed: 6
RevealsShroud:
Range: 6
- RenderUnitSpinner:
- Offset: 0,6
+ RenderUnit:
+ WithSpinner:
+ Offset: -299,0,171
AttackMove:
JustMove: yes
CreatesShroud:
@@ -546,8 +547,9 @@ MRJ:
Speed: 6
RevealsShroud:
Range: 6
- RenderUnitSpinner:
- Offset: 0,6
+ RenderUnit:
+ WithSpinner:
+ Offset: -256,0,256
AttackMove:
JustMove: yes
Explodes:
@@ -649,7 +651,8 @@ TTNK:
Weapon: TTankZap
LocalOffset: 0,0,213
AttackFrontal:
- RenderUnitSpinner:
+ RenderUnit:
+ WithSpinner:
Selectable:
Bounds: 28,28,0,0
AutoTarget: