Prevent saving and starting a map when max player count is exceeded.
This commit is contained in:
@@ -336,9 +336,6 @@ namespace OpenRA
|
|||||||
throw new InvalidDataException($"Map format {MapFormat} is not supported.\n File: {package.Name}");
|
throw new InvalidDataException($"Map format {MapFormat} is not supported.\n File: {package.Name}");
|
||||||
|
|
||||||
PlayerDefinitions = MiniYaml.NodesOrEmpty(yaml, "Players");
|
PlayerDefinitions = MiniYaml.NodesOrEmpty(yaml, "Players");
|
||||||
if (PlayerDefinitions.Count > 64)
|
|
||||||
throw new InvalidDataException($"Maps must not define more than 64 players.\n File: {package.Name}");
|
|
||||||
|
|
||||||
ActorDefinitions = MiniYaml.NodesOrEmpty(yaml, "Actors");
|
ActorDefinitions = MiniYaml.NodesOrEmpty(yaml, "Actors");
|
||||||
|
|
||||||
Grid = modData.Manifest.Get<MapGrid>();
|
Grid = modData.Manifest.Get<MapGrid>();
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
public class MapPlayers
|
public class MapPlayers
|
||||||
{
|
{
|
||||||
|
// Player masks are represented using a 64 bit integer
|
||||||
|
// The "Everyone" player for spectators is created at runtime,
|
||||||
|
// reducing the available player count for maps by 1.
|
||||||
|
public const int MaximumPlayerCount = 63;
|
||||||
public readonly Dictionary<string, PlayerReference> Players;
|
public readonly Dictionary<string, PlayerReference> Players;
|
||||||
|
|
||||||
public MapPlayers()
|
public MapPlayers()
|
||||||
|
|||||||
@@ -88,6 +88,12 @@ namespace OpenRA.Server
|
|||||||
status = Session.MapStatus.Incompatible;
|
status = Session.MapStatus.Incompatible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (map.Players.Players.Count > MapPlayers.MaximumPlayerCount)
|
||||||
|
{
|
||||||
|
Log.Write("server", "Failed to load `{0}`: Player count exceeds maximum ({1}/{2}).", map.Title, map.Players.Players.Count, MapPlayers.MaximumPlayerCount);
|
||||||
|
status = Session.MapStatus.Incompatible;
|
||||||
|
}
|
||||||
|
|
||||||
cache[map] = status;
|
cache[map] = status;
|
||||||
|
|
||||||
if ((status & Session.MapStatus.Validating) != 0)
|
if ((status & Session.MapStatus.Validating) != 0)
|
||||||
|
|||||||
@@ -351,12 +351,27 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
hideMenu = true;
|
hideMenu = true;
|
||||||
var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
|
var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
|
||||||
var actionManager = world.WorldActor.Trait<EditorActionManager>();
|
var actionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||||
|
|
||||||
|
var playerDefinitions = editorActorLayer.Players.ToMiniYaml();
|
||||||
|
|
||||||
|
var playerCount = new MapPlayers(playerDefinitions).Players.Count;
|
||||||
|
if (playerCount > MapPlayers.MaximumPlayerCount)
|
||||||
|
{
|
||||||
|
ConfirmationDialogs.ButtonPrompt(
|
||||||
|
title: "Error: Max player count exceeded",
|
||||||
|
text: $"There are too many players defined ({playerCount}/{MapPlayers.MaximumPlayerCount}).",
|
||||||
|
onConfirm: ShowMenu,
|
||||||
|
confirmText: "Back");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
|
Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onSave", (Action<string>)(_ => { hideMenu = false; actionManager.Modified = false; }) },
|
{ "onSave", (Action<string>)(_ => { hideMenu = false; actionManager.Modified = false; }) },
|
||||||
{ "onExit", () => hideMenu = false },
|
{ "onExit", () => hideMenu = false },
|
||||||
{ "map", world.Map },
|
{ "map", world.Map },
|
||||||
{ "playerDefinitions", editorActorLayer.Players.ToMiniYaml() },
|
{ "playerDefinitions", playerDefinitions },
|
||||||
{ "actorDefinitions", editorActorLayer.Save() }
|
{ "actorDefinitions", editorActorLayer.Save() }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user