From 3462607e9ad0bb64eeb1ed43c1d1bc6d27ae8b11 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 13 Feb 2010 21:14:15 +1300 Subject: [PATCH] added ISpawnStartingUnits trait; default impl just spawns an MCV --- OpenRa.Game/Game.cs | 14 ++++++-------- OpenRa.Game/OpenRa.Game.csproj | 1 + OpenRa.Game/Traits/Player/SpawnDefaultUnits.cs | 13 +++++++++++++ OpenRa.Game/Traits/TraitsInterfaces.cs | 1 + mods/cnc/system.yaml | 1 + mods/ra/rules.yaml | 1 + 6 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 OpenRa.Game/Traits/Player/SpawnDefaultUnits.cs diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index a4fcbd4736..3110d60ef3 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -233,14 +233,12 @@ namespace OpenRa foreach (var client in LobbyInfo.Clients) { - int2 sp; - if (client.SpawnPoint == 0) - sp = ChooseSpawnPoint(available, taken); - else - sp = world.Map.SpawnPoints.ElementAt(client.SpawnPoint - 1); - - // todo: spawn more than one unit, in most cases! - world.CreateActor("mcv", sp, world.players[client.Index]); + var sp = (client.SpawnPoint == 0) + ? ChooseSpawnPoint(available, taken) + : world.Map.SpawnPoints.ElementAt(client.SpawnPoint - 1); + + foreach (var ssu in world.players[client.Index].PlayerActor.traits.WithInterface()) + ssu.SpawnStartingUnits(world.players[client.Index], sp); } Game.viewport.GoToStartLocation( Game.world.LocalPlayer ); diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index de332af9c3..28ec54a56a 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -119,6 +119,7 @@ + diff --git a/OpenRa.Game/Traits/Player/SpawnDefaultUnits.cs b/OpenRa.Game/Traits/Player/SpawnDefaultUnits.cs new file mode 100644 index 0000000000..46a73966d7 --- /dev/null +++ b/OpenRa.Game/Traits/Player/SpawnDefaultUnits.cs @@ -0,0 +1,13 @@ + +namespace OpenRa.Traits +{ + class SpawnDefaultUnitsInfo : StatelessTraitInfo { } + + class SpawnDefaultUnits : ISpawnStartingUnits + { + public void SpawnStartingUnits(Player p, int2 sp) + { + p.PlayerActor.World.CreateActor("mcv", sp, p); + } + } +} diff --git a/OpenRa.Game/Traits/TraitsInterfaces.cs b/OpenRa.Game/Traits/TraitsInterfaces.cs index 8a8aca639e..9f4f765e1e 100644 --- a/OpenRa.Game/Traits/TraitsInterfaces.cs +++ b/OpenRa.Game/Traits/TraitsInterfaces.cs @@ -104,4 +104,5 @@ namespace OpenRa.Traits public interface INotifySelection { void SelectionChanged(); } public interface ILoadWorldHook { void WorldLoaded(World w); } + public interface ISpawnStartingUnits { void SpawnStartingUnits(Player p, int2 sp); } } diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index e4c0075d78..a6d95e4fc0 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -9,6 +9,7 @@ Player: CancelledAudio: cancel1.aud ClickAudio: button.aud PlaceBuilding: + SpawnDefaultUnits: World: WaterPaletteRotation: diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 68ac2922a1..035e4b2d46 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -57,6 +57,7 @@ Player: TechLevel: 5 GivenAuto: no OneShot: yes + SpawnDefaultUnits: World: WaterPaletteRotation: