diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj
index c57308d299..a287dcbac4 100644
--- a/OpenRa.Game/OpenRa.Game.csproj
+++ b/OpenRa.Game/OpenRa.Game.csproj
@@ -229,6 +229,7 @@
+
diff --git a/OpenRa.Game/Orders/UnitOrders.cs b/OpenRa.Game/Orders/UnitOrders.cs
index 353be5be0b..85041a34b0 100644
--- a/OpenRa.Game/Orders/UnitOrders.cs
+++ b/OpenRa.Game/Orders/UnitOrders.cs
@@ -12,27 +12,6 @@ namespace OpenRa.Orders
{
switch( order.OrderString )
{
- case "PlaceBuilding":
- {
- Game.world.AddFrameEndTask( _ =>
- {
- var queue = order.Player.PlayerActor.traits.Get();
- var unit = Rules.ActorInfo[ order.TargetString ];
- var producing = queue.CurrentItem(unit.Category);
- if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
- return;
-
- Game.world.CreateActor( order.TargetString, order.TargetLocation - Footprint.AdjustForBuildingSize( unit.Traits.Get() ), order.Player );
- if (order.Player == Game.LocalPlayer)
- {
- Sound.Play("placbldg.aud");
- Sound.Play("build5.aud");
- }
-
- queue.FinishProduction(unit.Category);
- } );
- break;
- }
case "Chat":
{
Game.chat.AddLine(order.Player, order.TargetString);
diff --git a/OpenRa.Game/Traits/PlaceBuilding.cs b/OpenRa.Game/Traits/PlaceBuilding.cs
new file mode 100755
index 0000000000..fb64d0b23a
--- /dev/null
+++ b/OpenRa.Game/Traits/PlaceBuilding.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using OpenRa.GameRules;
+
+namespace OpenRa.Traits
+{
+ class PlaceBuildingInfo : StatelessTraitInfo { }
+
+ class PlaceBuilding : IResolveOrder
+ {
+ public void ResolveOrder( Actor self, Order order )
+ {
+ if( order.OrderString == "PlaceBuilding" )
+ {
+ Game.world.AddFrameEndTask( _ =>
+ {
+ var queue = self.traits.Get();
+ var unit = Rules.ActorInfo[ order.TargetString ];
+ var producing = queue.CurrentItem(unit.Category);
+ if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
+ return;
+
+ Game.world.CreateActor( order.TargetString, order.TargetLocation - Footprint.AdjustForBuildingSize( unit.Traits.Get() ), order.Player );
+ if (order.Player == Game.LocalPlayer)
+ {
+ Sound.Play("placbldg.aud");
+ Sound.Play("build5.aud");
+ }
+
+ queue.FinishProduction(unit.Category);
+ } );
+ }
+ }
+ }
+}
diff --git a/merge-ra.yaml b/merge-ra.yaml
index 5932bea2f4..91a72aedc9 100644
--- a/merge-ra.yaml
+++ b/merge-ra.yaml
@@ -1,29 +1,30 @@
Player:
ProductionQueue:
+ PlaceBuilding:
World:
WaterPaletteRotation:
ChronoshiftPaletteEffect:
LightPaletteRotator:
-
+
MGG:
GeneratesGap:
Range: 10
GAP:
GeneratesGap:
- Range: 10
-
-MINP:
- Mine:
- Damage: 1000
- Warhead: APMine
- TriggeredBy: Foot, Wheel, Track
- AvoidFriendly: yes
-
-MINV:
- Mine:
- Damage: 1200
- Warhead: ATMine
- TriggeredBy: Wheel, Track
- AvoidFriendly: yes
\ No newline at end of file
+ Range: 10
+
+MINP:
+ Mine:
+ Damage: 1000
+ Warhead: APMine
+ TriggeredBy: Foot, Wheel, Track
+ AvoidFriendly: yes
+
+MINV:
+ Mine:
+ Damage: 1200
+ Warhead: ATMine
+ TriggeredBy: Wheel, Track
+ AvoidFriendly: yes
diff --git a/ra.yaml b/ra.yaml
index af4429a58f..fc8c476214 100644
--- a/ra.yaml
+++ b/ra.yaml
@@ -1,5 +1,6 @@
Player:
ProductionQueue:
+ PlaceBuilding:
World:
WaterPaletteRotation: