diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 65f0c00bf1..1453616681 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -46,29 +46,34 @@ namespace OpenRA public ShroudRenderer Shroud; public World World { get; private set; } - public Player( World world, Session.Client client ) + public Player( World world, PlayerReference pr, int index ) { World = world; Shroud = new ShroudRenderer(this, world.Map); PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); - if (client != null) - { - Index = client.Index; - Palette = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Name; - Color = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Color; - PlayerName = client.Name; - InternalName = "Multi{0}".F(client.Index); - } - else - { - Index = -1; - PlayerName = InternalName = "Neutral"; - Palette = "neutral"; - Color = Color.Gray; // HACK HACK - } + Index = index; + Palette = pr.Palette; + Color = world.PlayerColors().Where(c => c.Name == pr.Palette).FirstOrDefault().Color; + PlayerName = InternalName = pr.Name; + isSpecial = pr.isSpecial; + Country = world.GetCountries() + .FirstOrDefault(c => pr.Race == c.Race); + } + + public Player( World world, Session.Client client ) + { + World = world; + Shroud = new ShroudRenderer(this, world.Map); + PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); + + Index = client.Index; + Palette = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Name; + Color = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Color; + PlayerName = client.Name; + InternalName = "Multi{0}".F(client.Index); Country = world.GetCountries() .FirstOrDefault(c => client != null && client.Country == c.Name) ?? world.GetCountries().Random(world.SharedRandom); diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index b89e8acab0..6c17f8d585 100644 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -114,7 +114,7 @@ namespace OpenRA.Widgets.Delegates } } - bool PaletteAvailable(int index) { return Game.LobbyInfo.Clients.All(c => c.PaletteIndex != index); } + bool PaletteAvailable(int index) { return Game.LobbyInfo.Clients.All(c => c.PaletteIndex != index) && Game.world.PlayerColors()[index % Game.world.PlayerColors().Count].Playable; } bool SpawnPointAvailable(int index) { return (index == 0) || Game.LobbyInfo.Clients.All(c => c.SpawnPoint != index); } bool CyclePalette(MouseInput mi) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index cce7b64502..1906c026e3 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -94,20 +94,7 @@ namespace OpenRA int mapPlayerIndex = -1; foreach (var kv in Map.Players) { - var player = new Player(this, null); - - // Lets just pretend that i didn't do this.... Will fix later - player.GetType().GetField("Index").SetValue( player, mapPlayerIndex-- ); - player.GetType().GetField("Palette").SetValue( player, kv.Value.Palette );// Todo: set Player.Color as well - player.GetType().GetField("PlayerName").SetValue( player, kv.Value.Name ); - player.GetType().GetField("InternalName").SetValue( player, kv.Value.Name ); - player.GetType().GetField("isSpecial").SetValue( player, kv.Value.isSpecial ); - - var country = WorldActor.Info.Traits.WithInterface().FirstOrDefault(c => kv.Value.Race == c.Race); - if (country == null) - throw new NotImplementedException("Invalid country: {0}".F(kv.Value.Race)); - player.GetType().GetField("Country").SetValue( player, country); - + var player = new Player(this, kv.Value, mapPlayerIndex--); AddPlayer(player); if (kv.Value.OwnsWorld) diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 4c8b8a0da0..d3ab407ab3 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -239,9 +239,7 @@ namespace OpenRA public static List PlayerColors(this World world) { - return world.WorldActor.Info.Traits.WithInterface() - .Where(p => p.Playable) - .ToList(); + return world.WorldActor.Info.Traits.WithInterface().ToList(); } } }