diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index 1985da8503..23680ea3d7 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -58,15 +58,12 @@ namespace OpenRA public class MapOptions { - public bool? AllyBuildRadius; public string TechLevel; public string[] Difficulties = { }; public bool? ShortGame; public void UpdateServerSettings(Session.Global settings) { - if (AllyBuildRadius.HasValue) - settings.AllyBuildRadius = AllyBuildRadius.Value; if (ShortGame.HasValue) settings.ShortGame = ShortGame.Value; } diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index f19e4b8e08..4190885ebc 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -733,6 +733,7 @@ + diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 5d5320faf2..8f8310da0f 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -569,7 +569,8 @@ namespace OpenRA.Mods.Common.Server return true; } - if (server.Map.Options.AllyBuildRadius.HasValue) + var mapBuildRadius = server.Map.Rules.Actors["world"].TraitInfoOrDefault(); + if (mapBuildRadius == null || mapBuildRadius.AllyBuildRadiusLocked) { server.SendOrderTo(conn, "Message", "Map has disabled ally build radius configuration."); return true; @@ -1035,6 +1036,9 @@ namespace OpenRA.Mods.Common.Server var startingUnits = server.Map.Rules.Actors["world"].TraitInfoOrDefault(); gs.StartingUnitsClass = startingUnits == null ? "none" : startingUnits.StartingUnitsClass; + var mapBuildRadius = server.Map.Rules.Actors["world"].TraitInfoOrDefault(); + gs.AllyBuildRadius = mapBuildRadius != null && mapBuildRadius.AllyBuildRadiusEnabled; + server.Map.Options.UpdateServerSettings(server.LobbyInfo.GlobalSettings); } diff --git a/OpenRA.Mods.Common/Traits/World/MapBuildRadius.cs b/OpenRA.Mods.Common/Traits/World/MapBuildRadius.cs new file mode 100644 index 0000000000..d3becc3a00 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/World/MapBuildRadius.cs @@ -0,0 +1,28 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Controls the build radius checkboxes in the lobby options.")] + public class MapBuildRadiusInfo : TraitInfo + { + [Desc("Default value of the ally build radius checkbox in the lobby.")] + public readonly bool AllyBuildRadiusEnabled = true; + + [Desc("Prevent the ally build radius state from being changed in the lobby.")] + public readonly bool AllyBuildRadiusLocked = false; + } + + public class MapBuildRadius { } +} diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index b33cbd46a5..d4d61c6d5f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -391,8 +391,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic var allybuildradius = optionsBin.GetOrNull("ALLYBUILDRADIUS_CHECKBOX"); if (allybuildradius != null) { + var allyBuildRadiusLocked = new CachedTransform(map => + { + var mapBuildRadius = map.Rules.Actors["world"].TraitInfoOrDefault(); + return mapBuildRadius == null || mapBuildRadius.AllyBuildRadiusLocked; + }); + allybuildradius.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllyBuildRadius; - allybuildradius.IsDisabled = () => configurationDisabled() || Map.Options.AllyBuildRadius.HasValue; + allybuildradius.IsDisabled = () => configurationDisabled() || allyBuildRadiusLocked.Update(Map); allybuildradius.OnClick = () => orderManager.IssueOrder(Order.Command( "allybuildradius {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllyBuildRadius))); } diff --git a/mods/cnc/rules/world.yaml b/mods/cnc/rules/world.yaml index 588310043a..7a0a5d3b46 100644 --- a/mods/cnc/rules/world.yaml +++ b/mods/cnc/rules/world.yaml @@ -74,6 +74,7 @@ World: WarheadDebugOverlay: MapCreeps: SpawnMapActors: + MapBuildRadius: MPStartLocations: CreateMPPlayers: MPStartUnits@mcvonly: diff --git a/mods/d2k/rules/world.yaml b/mods/d2k/rules/world.yaml index 5a8ac60f62..74e52b12ca 100644 --- a/mods/d2k/rules/world.yaml +++ b/mods/d2k/rules/world.yaml @@ -89,6 +89,7 @@ World: SmokePercentage: 0 MapCreeps: SpawnMapActors: + MapBuildRadius: CreateMPPlayers: MPStartLocations: MPStartUnits@mcv: diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 7a1be7743b..78c91500c7 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -120,6 +120,7 @@ World: PathfinderDebugOverlay: WarheadDebugOverlay: SpawnMapActors: + MapBuildRadius: CreateMPPlayers: MPStartUnits@mcvonly: Class: none diff --git a/mods/ts/rules/world.yaml b/mods/ts/rules/world.yaml index 0d1204d59e..cecc6d4194 100644 --- a/mods/ts/rules/world.yaml +++ b/mods/ts/rules/world.yaml @@ -98,6 +98,7 @@ World: PathfinderDebugOverlay: WarheadDebugOverlay: SpawnMapActors: + MapBuildRadius: CreateMPPlayers: MPStartUnits@MCV: Class: none